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

32

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

J'arbitré ce Q & A .

Mais je n'ai pas eu de solution spécifique. Voici l'exemple que j'ai essayé: J'ai créé un abc.shfichier 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 ps aux | grep "abc"commande.

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 abc.shscript en cours d'exécution et lance la même commande de ps aux | grep "abc"commande.

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?

Prakash V Holkar
la source

Réponses:

41

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é.

Cependant, dans votre cas, puisque vous avez exécuté le processus en utilisant sh abc.sh, shl’application (shell) est en cours d’exécution et non abc.sh. Par conséquent, ps auxne contiendra pas le processus en abc.shraison de ce qui grepne pourrait donner 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 ayant la chaîne shn'importe où dans leur sortie ps aux.

Vous devez noter que le processus sera "en cours d'exécution" lorsque la sortie de ps auxaura son STATas R. 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 topcommande pour vérifier si le processus est en cours d'exécution ou en veille, ainsi que la quantité de CPU et de RAM qu'il consomme. (Ceci listera à nouveau votre processus en tant que sh).

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 être la suivante:

#!/bin/sh

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

chmod +x /path/to/abc.sh

en remplaçant /path/to/par l’emplacement du abc.shfichier puis en abc.shutilisant

/path/to/abc.sh

en remplaçant de nouveau /path/to/par l'emplacement du abc.shfichier.

jobin
la source
2
Une petite question. qu'est-ce que stat S+signifie
Prakash V Holkar
Mais vous pouvez trouver la différence entre les processus en cours et les processus non en cours via la sortie de la ps aux | grep filenamecommande.
Avinash Raj
@ TechGuru: Cela signifie que le processus est en veille au premier plan, reportez-vous à la page de manuel de ps pour en savoir plus.
jobin
@AvinashRaj: Oui, bien sûr, vous pouvez.
jobin
Je reçois une erreur: Erreur, faites ceci: mount -t proc proc / proc
IgorGanapolsky
7

Mon problème avec grepest que c'est un analyseur de ligne entière. Dans votre exemple, vous recherchez "abc" mais vous retirez l'instance de grep(c'est-à-dire "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 la ou les colonnes de commande, donc si la commande est "sh abc.sh ...", $11sera shet $12sera abc.sh.

Si vous souhaitez contrôler la sortie ou la chaîne avec Bash's &&et les ||opérateurs, vous pouvez le faire, mais vous devrez être un peu plus intelligent. grepsortira avec le code d'état 1 (défaillance technique, déclencheurs ||) si rien n'est trouvé mais awksortira toujours du code 0. Nous pouvons le changer en lui disant de quitter s'il trouve quelque chose et de jeter 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 les résultats à l'écran, vous pouvez le faire de la même manière awk:

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

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

Exemple:

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

Cela signifie que le sh abc.shprocessus 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 sh abc.shprocessus uniquement à l' aide de:

jobs sh

Voir help jobspour 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 dactylographiée dans le résultat ( sh abc.shdans ce cas), cela signifie que le processus est toujours en cours d'exécution. Sinon, le processus est terminé.

Radu Rădeanu
la source
3

Si votre script est en cours d'exécution, il doit être affiché par ps auxcommande. S'il ne s'affiche pas ps, il se peut que l'exécution du script soit actuellement terminée.

La sortie de psce type 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é. En attendant, si vous exécutez la ps aux | grep filenamecommande, elle sera affichée sur la sortie. Parce que le script est en cours d'exécution.

Avinash Raj
la source
-2
  • si vous voulez vérifier tous les processus, utilisez 'top'

  • si vous voulez connaître les processus exécutés par Java, utilisez ps -ef | grep java

  • si un autre processus, utilisez ps -ef | grep xyzsimplement ou simplement/etc/init.d xyz status

  • si à travers un code comme .shalors./xyz.sh status

Umman
la source
1
-1 Bien que ces commandes soient utiles dans certaines circonstances, elles seront toujours inutiles pour quelqu'un qui ne connaît pas ces circonstances. Dans chaque cas, soit vous ne les expliquez pas assez, soit votre explication est fausse.
David Foerster
-2

si vous voulez simplement vérifier s'il y a un processus en cours, accédez à ce répertoire et tapez ll -trsi vous voyez .csvou .worketc. à la fin du fichier, cela signifie que processus est en cours sinon, pas.

Umman
la source
Cette réponse n'a aucun sens. Lister le contenu d'un répertoire ne vous dira pas si un processus est en cours d'exécution. L'extension de fichier .csvconcerne les fichiers délimités par des virgules qui ne sont pas liés à un processus en cours d'exécution.
user369450