Obtenez le programme qui satisfait la condition

LinuxLinuxBeginner
Pratiquer maintenant

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Dans ce projet, vous allez apprendre à créer un script qui peut vérifier si un programme est en cours d'exécution sur un port spécifié et afficher le chemin complet du programme ou "OK" si aucun programme n'est en cours d'exécution.

👀 Aperçu

## Exemple
$ cd /home/labex/project
$ sh get.sh 3000
/usr/lib/code-server/lib/node
$ sh get.sh 43000
OK

🎯 Tâches

Dans ce projet, vous allez apprendre :

  • Comment créer un script Zsh
  • Comment utiliser la commande lsof pour vérifier si un port est utilisé
  • Comment utiliser la commande ps pour obtenir le chemin complet d'un programme en cours d'exécution

🏆 Réalisations

Après avoir terminé ce projet, vous serez capable de :

  • Écrire un script qui peut identifier le programme en cours d'exécution sur un port spécifié
  • Résoudre les problèmes liés aux conflits de ports dans votre environnement de développement
  • Automatiser le processus de vérification des programmes en cours d'exécution sur des ports spécifiques

Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/TextProcessingGroup(["Text Processing"]) linux(("Linux")) -.-> linux/SystemInformationandMonitoringGroup(["System Information and Monitoring"]) linux(("Linux")) -.-> linux/RemoteAccessandNetworkingGroup(["Remote Access and Networking"]) linux(("Linux")) -.-> linux/BasicSystemCommandsGroup(["Basic System Commands"]) linux(("Linux")) -.-> linux/FileandDirectoryManagementGroup(["File and Directory Management"]) linux/BasicSystemCommandsGroup -.-> linux/echo("Text Display") linux/BasicSystemCommandsGroup -.-> linux/test("Condition Testing") linux/BasicSystemCommandsGroup -.-> linux/exit("Shell Exiting") linux/FileandDirectoryManagementGroup -.-> linux/cd("Directory Changing") linux/TextProcessingGroup -.-> linux/sed("Stream Editing") linux/TextProcessingGroup -.-> linux/awk("Text Processing") linux/SystemInformationandMonitoringGroup -.-> linux/ps("Process Displaying") linux/RemoteAccessandNetworkingGroup -.-> linux/netstat("Network Monitoring") subgraph Lab Skills linux/echo -.-> lab-301473{{"Obtenez le programme qui satisfait la condition"}} linux/test -.-> lab-301473{{"Obtenez le programme qui satisfait la condition"}} linux/exit -.-> lab-301473{{"Obtenez le programme qui satisfait la condition"}} linux/cd -.-> lab-301473{{"Obtenez le programme qui satisfait la condition"}} linux/sed -.-> lab-301473{{"Obtenez le programme qui satisfait la condition"}} linux/awk -.-> lab-301473{{"Obtenez le programme qui satisfait la condition"}} linux/ps -.-> lab-301473{{"Obtenez le programme qui satisfait la condition"}} linux/netstat -.-> lab-301473{{"Obtenez le programme qui satisfait la condition"}} end

Créez le script get.sh

Dans cette étape, vous allez créer le script get.sh qui vérifiera si un programme est en cours d'exécution sur un port spécifié.

  1. Ouvrez un éditeur de texte et créez un nouveau fichier nommé get.sh dans le répertoire /home/labex/project.

  2. Ajoutez le code suivant pour vérifier si un numéro de port est fourni en tant qu'argument :

    ## Vérifiez si le numéro de port est fourni en tant qu'argument
    if [ -z "$1" ]; then
      echo "Veuillez fournir un numéro de port."
      exit 1
    fi

    Ce code vérifie si le script a été appelé avec un numéro de port en tant qu'argument. Sinon, il affiche un message d'erreur et quitte le script.

  3. Ajoutez le code suivant pour obtenir le numéro de port :

    ## Obtenez le numéro de port
    port=$1

    Ce code stocke le numéro de port fourni dans la variable port.

  4. Enregistrez le fichier get.sh.

Vérifiez si un programme est en cours d'exécution sur le port spécifié

Dans cette étape, vous allez ajouter le code pour vérifier si un programme est en cours d'exécution sur le port spécifié.

  1. Ajoutez le code suivant au script get.sh :

    ## Vérifiez si le port est utilisé
    process=$(lsof -i :$port -sTCP:LISTEN -Fp | sed 's/^p//')

    Ce code utilise la commande lsof pour vérifier si un processus est en écoute sur le port spécifié. La sortie est stockée dans la variable process.

  2. Ajoutez le code suivant pour vérifier si un programme est en cours d'exécution :

    ## Vérifiez si un programme est en cours d'exécution
    if [ -z "$process" ]; then
      echo "OK"
    else
      ## Obtenez le chemin complet du programme
      path=$(ps -p $process -o args=)
      echo "$path" | awk '{print $1}'
    fi

    Ce code vérifie si la variable process est vide (c'est-à-dire qu'aucun programme n'est en cours d'exécution sur le port spécifié). Si elle est vide, le script affiche "OK". Si un programme est en cours d'exécution, le script utilise la commande ps pour obtenir le chemin complet du programme et l'affiche.

  3. Enregistrez le fichier get.sh.

Testez le script get.sh

Dans cette étape, vous allez tester le script get.sh pour vous assurer qu'il fonctionne comme prévu.

  1. Ouvrez un terminal et accédez au répertoire /home/labex/project.

  2. Exécutez le script get.sh avec un numéro de port en tant qu'argument :

    $ sh get.sh 3000
    /usr/lib/code-server/lib/node

    Cela devrait afficher le chemin complet du programme en cours d'exécution sur le port 3000.

  3. Exécutez le script get.sh avec un numéro de port qui n'est pas utilisé :

    $ sh get.sh 43000
    OK

    Cela devrait afficher "OK" car aucun programme n'est en cours d'exécution sur le port 43000.

  4. Si le script fonctionne comme prévu, vous avez terminé le projet.

Félicitations! Vous avez créé un script qui peut vérifier si un programme est en cours d'exécution sur un port spécifié et afficher le chemin complet du programme ou "OK" si aucun programme n'est en cours d'exécution.

✨ Vérifier la solution et pratiquer

Sommaire

Félicitations! Vous avez terminé ce projet. Vous pouvez pratiquer plus de laboratoires dans LabEx pour améliorer vos compétences.