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?
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
, sh
correspond à 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 grep
ne 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 sh
n'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 STAT
en tant que R
name__. 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 top
pour 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 sh
name__).
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
.
Mon problème avec grep
est 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 awk
pour un peu de panache.
ps aux | awk '$12=="abc.sh"'
awk
divise 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 sh
et $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. grep
quittera avec le code d'état 1 (défaillance technique, déclenchera ||
) si rien n'est trouvé, mais awk
quittera 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 awk
name__:
ps aux | awk '$12=="abc.sh" {print "running"; exit} END{print "not running"}'
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é.
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.