web-dev-qa-db-fra.com

comment savoir si un script exécuté en tant que Nohup s'est terminé ou non?

J'ai essayé d'exécuter un script en utilisant Nohup comme,

Nohup script.sh &

Quand j'ai essayé

ps -ef | grep "script.sh"

Je ne pouvais pas le trouver là-bas, sauf pour le grep qui est exécuté avec cette chaîne comme paramètre.

Est-ce que je le fais bien?. Est-ce à dire que le processus a bien fini son exécution? Merci.

24
learner135

Au début de votre script Shell, écrivez le PID dans un fichier (par exemple, dans/var/run). Ensuite, vous pouvez simplement rechercher ce PID pour savoir si le processus est terminé ou non. Vous pouvez obtenir le PID de votre script Shell en utilisant le $$ variable.

Pour enregistrer le PID, mettez en haut de votre script:

echo $$ > /var/run/myscript.pid

Ensuite, pour vérifier s'il fonctionne toujours:

ps -p `cat /var/run/myscript.pid`

Vous ne pourrez peut-être pas écrire dans /var/run en tant qu'utilisateur normal. Sinon, utilisez simplement /tmp

17
Edward Dale

Sous réserve de la mise en œuvre de Nohup, mais dans la plupart des cas, cela fonctionnera. Après avoir couru

Nohup script.sh &

stocker le PID dans une variable. $! est le PID du dernier processus d'arrière-plan.

HISPID=$!

Ensuite, vous pouvez vérifier s'il est là avec ps ou kill:

ps -p $HISPID
kill -0 $HISPID

Contrairement à l'autre solution publiée, cela ne nécessite pas de modifier le script.sh

16
unbeli

J'ai suivi la suggestion de scompt.com en modifiant mon script pour stocker le pid

Ensuite, j'ai remarqué que le pid est écrit dans la sortie, il n'est donc pas nécessaire de le stocker:

$ Nohup ./sync-all.production.sh > sync-all.production.log &

[1] 3428
4
decibel.places

ce qui a fonctionné est

Sudo ps -e | grep [script name or fragment of name]

par exemple pour un script nommé "mf-sync.js"

Sudo ps -e | grep mf-sync

affiche le nom du script et le pid; alors je peux utiliser, par exemple si pid était 1234

Sudo kill 1234

ensuite, je dois ajouter un délai d'expiration pour le tuer automatiquement après un délai suffisant pour qu'il fonctionne normalement, mais c'est une autre question

pendant ce temps, je peux garder ce processus pour exécuter la synchronisation pour mon client, jusqu'à ce que j'ai le temps de tester le délai d'expiration dans un script

3
decibel.places

$! fait définitivement partie de ksh et ksh93.

echo $Shell

vous montrera quel Shell vous utilisez.

Exemple d'utilisation raisonnable de &

#!/bin/ksh
Nohup ./myscript.sh argument1 2>&1> mylogfile &
# do some other task
cnt=0
while [ $cnt -le 100 ]
do
    # work on another task here
    cnt=$(( $cnt + 1 ))
done
wait

L'instruction d'attente fait une pause pour tout processus enfant en cours d'exécution. Normalement, vous ne plongez pas un processus en arrière-plan, ne vous attendez pas à ce qu'il s'exécute pour toujours, puis l'oubliez complètement.

Si vous voulez un processus complètement détaché qui s'exécute pour toujours, pensez à un démon. Certaines personnes écrivent des démons dans Shell - ce n'est pas la meilleure pratique - mais c'est fait. Normalement, les démons UNIX sont écrits en C.

Le chapitre 13 de Stevens 'Advanced Programming in the UNIx Environment' 2ed est consacré aux démons.

3
jim mcnamara

Code:

ps r

pour signaler tous les processus en cours.

0
Helena