web-dev-qa-db-fra.com

Comment vérifier si le processus est déjà en cours ou non

Je veux vérifier le processus particulier en cours ou non.

J'ai arbitré ce Q & A .

Mais je n'ai pas eu de solution spécifique. Voici l'exemple que j'ai essayé: J'ai créé le fichier abc.sh et exécute ce script en arrière-plan, comme sh abc.sh &.

Maintenant, ce fichier s'exécute en arrière-plan et je lance la commande ps aux | grep "abc".

Voici le résultat de cette commande:

prakash     3594  0.0  0.0   4388   820 pts/0    S+   16:44   0:00 grep --color=auto abc

Après cela, j'arrête le script en cours d'exécution abc.sh et lance la même commande ps aux | grep "abc".

Mais je reçois le même résultat comme:

prakash     3594  0.0  0.0   4388   820 pts/0    S+   16:44   0:00 grep --color=auto abc

Existe-t-il un autre moyen de savoir si le processus est en cours d'exécution ou non?

31
Prakash V Holkar

Chaque processus sera répertorié dans la sortie de ps aux; que ce soit en cours d'exécution, en dormant, zombie ou arrêté.

Toutefois, dans votre cas, puisque vous avez exécuté le processus à l'aide de sh abc.sh, shcorrespond à l'application (Shell) en cours d'exécution et non à abc.sh. De ce fait, ps aux ne contiendra pas le processus abc.sh car grepne pourrait produire aucun résultat.

Donc, la bonne façon de l’utiliser est la suivante:

ps aux | grep sh

Cela peut également vous renvoyer d'autres processus en cours d'exécution portant la chaîne shn'importe où dans leur sortie de ps aux.

Notez que le processus sera "en cours d'exécution" lorsque la sortie de ps aux aura son STATen tant que Rname__. S'il s'agit de quelque chose d'autre, il ne s'exécute pas sur l'instance à laquelle vous avez lancé la commande pour vérifier les processus en cours. Les différents états de processus sont disponibles dans la page de manuel de ps:

D    uninterruptible sleep (usually IO)
R    running or runnable (on run queue)
S    interruptible sleep (waiting for an event to complete)
T    stopped, either by a job control signal or because it is being traced
W    paging (not valid since the 2.6.xx kernel)
X    dead (should never be seen)
Z    defunct ("zombie") process, terminated but not reaped by its parent

Vous pouvez également exécuter la commande toppour vérifier si le processus est en cours d'exécution ou en veille et quelle est la quantité de CPU, RAM qu'il consomme. (Ceci va à nouveau lister votre processus sous le nom shname__).

Toutefois, si vous souhaitez que votre processus soit répertorié sous la forme abc.sh, la première ligne du script que vous exécutez doit alors être la suivante:

#!/bin/sh

afin que le shell sache quelle application utiliser pour exécuter le script (sh dans ce cas, changez-le en #!/bin/bash pour bash) puis fournissez des autorisations exécutables au processus en utilisant:

chmod +x /path/to/abc.sh

en remplaçant /path/to/ par l’emplacement du fichier abc.sh puis en exécutant abc.sh en utilisant

/path/to/abc.sh

en remplaçant à nouveau /path/to/ par l'emplacement du fichier abc.sh.

41
jobin

Mon problème avec grepest que c'est un analyseur syntaxique complet. Dans votre exemple, vous recherchez "abc" mais vous récupérez l'instance de grep(qui recherche "abc"). Un peu circulaire. Vous pouvez filtrer cela, mais je trouve tout cela un peu pervers.

Je me tournerais vers awkpour un peu de panache.

ps aux | awk '$12=="abc.sh"'

awkdivise les lignes en champs en fonction des espaces (par défaut). Les champs $ 11 + sont les colonnes de commande. Par conséquent, si la commande est "sh abc.sh ...", $11 sera shet $12 sera abc.sh.

Si vous souhaitez contrôler la sortie ou la chaîne avec les opérateurs && et || de Bash, vous pouvez le faire, mais vous devrez être un peu plus intelligent. grepquittera avec le code d'état 1 (défaillance technique, déclenchera ||) si rien n'est trouvé, mais awkquittera toujours le code 0. Nous pouvons le modifier en lui indiquant de quitter s'il trouve quelque chose et de lancer un 1 s'il ne le fait pas:

ps aux | awk '$12=="abc.sh" {exit 0} END{exit 1}' && echo running || echo not running

Bien sûr, si vous vous souciez d'écrire le résultat à l'écran, vous pouvez le faire en awkname__:

ps aux | awk '$12=="abc.sh" {print "running"; exit} END{print "not running"}'
6
Oli

La bonne façon de vérifier dans la session bash actuelle si un processus démarré en arrière-plan, tel que sh abc.sh &, est déjà en cours d'exécution ou non, consiste à utiliser la commande intégrée jobs.

Exemple:

$ sh abc.sh &
[1] 6917
$ jobs
[1]+  Running                 sh abc.sh &

Cela signifie que le processus sh abc.sh démarré en arrière-plan est en cours d'exécution. Si le processus est terminé, vous verrez quelque chose comme:

[1]+  Done                    sh abc.sh

Si plusieurs processus s'exécutent en arrière-plan, vous pouvez limiter la sortie au processus sh abc.sh à l'aide de:

jobs sh

Voir help jobs pour plus d'informations.

La méthode ci-dessus ne fonctionnera que dans la session en cours de bash. Mais si vous êtes dans une autre session bash (par exemple, dans une autre fenêtre de terminal ou un autre onglet, ou dans un script), mis à part:

ps aux | grep "[s]h bin/test.sh"

vous pouvez aussi utiliser:

pgrep -a sh

ce qui me semble plus simple. Si vous voyez votre commande saisie dans le résultat (sh abc.sh dans ce cas), cela signifie que le processus est toujours en cours d'exécution. Sinon, le processus est terminé.

4
Radu Rădeanu

Si votre script est en cours d'exécution, il doit être affiché par la commande ps aux. Si ps ne l’a pas été affichée, l’exécution de votre script est peut-être terminée.

La sortie de ps comme ceci signifie que votre script n'est pas en cours d'exécution,

$ ps aux | grep hm.sh
avinash   6386  0.0  0.0  15940   932 pts/16   S+   17:34   0:00 grep --color=auto hm.sh

Si tel est le cas, cela signifie que votre script est en cours d'exécution.

$ ps aux | grep hm.sh
avinash   6454  0.0  0.0  16616  1384 pts/16   S+   17:35   0:00 /bin/bash ./hm.sh
avinash   6535  0.0  0.0  15940   932 pts/27   R+   17:35   0:00 grep --color=auto hm.sh

Tout est basé sur le contenu du script.

Par exemple, si vous créez un script comme celui-ci. Il affiche le message HI lors de l'exécution. Il faut quelques secondes pour afficher la sortie et se terminer après avoir généré le résultat final.

#!/bin/bash
echo "HI"

Mais si votre script ressemble à ça,

#!/bin/bash
Sudo apt-get update

Il faut quelques minutes pour que le processus soit terminé. Entre-temps, si vous exécutez la commande ps aux | grep filename, celle-ci sera affichée sur le résultat. Parce que le script est en cours d'exécution.

3
Avinash Raj