Quelle est la commande linux à rechercher si un processus dit que aa.sh est en cours d’exécution ou non . La commande ps ne semble pas fonctionner et n’affiche pas les noms de script Shell.
S'il vous plaît donnez votre avis.
Vérifie ça
ps aux | grep "aa.sh"
La solution la plus simple est:
pgrep -fl aa.sh
Ajout aux réponses ci-dessus -
Pour utiliser dans un script, utilisez ce qui suit: -
result=`ps aux | grep -i "myscript.sh" | grep -v "grep" | wc -l`
if [ $result -ge 1 ]
then
echo "script is running"
else
echo "script is not running"
fi
Vérifie ça
ps -ef | grep shellscripname.sh
Vous pouvez également trouver votre processus en cours dans
ps -ef
Les solutions ci-dessus sont idéales pour une utilisation interactive, où vous pouvez observer le résultat et éliminer les faux positifs de cette façon.
De faux positifs peuvent se produire si l'exécutable lui-même correspond, ou si des arguments qui ne sont pas des noms de script correspondent - la probabilité est plus grande avec des scripts sans extension de nom de fichier.
Voici un plus robuste solution pour scripting , en utilisant une fonction Shell :
getscript() {
pgrep -lf ".[ /]$1( |\$)"
}
Exemple d'utilisation:
# List instance(s) of script "aa.sh" that are running.
getscript "aa.sh" # -> (e.g.): 96112 bash /Users/jdoe/aa.sh
# Use in a test:
if getscript "aa.sh" >/dev/null; then
echo RUNNING
fi
-i
à l'appel pgrep
pour le rendre sensible à la casse -in, ce qui n'est pas une option sous Linux.)getscript
fonctionne également avec des chemins complets ou partiels incluant le composant filename; les chemins partiels ne doivent pas commencer par /
et chaque composant spécifié doit être complet. Plus le chemin spécifié est "complet", plus le risque de faux positifs est faible. Caveat : La correspondance de chemin ne fonctionnera que si le script était invoqué avec un chemin - ceci est généralement vrai pour les scripts de $ PATH invoqués directement.ps
ni pgrep
ne reflètent la citation d'origine appliquée à la ligne de commande. Toute la fonction garantit que toute correspondance est n'est pas le premier jeton (qui est l'interpréteur), et qu'elle se présente sous la forme d'un mot séparé, éventuellement précédé d'un chemin.bash
) ainsi - en supposant qu'il soit connu; par exemple.# List instance(s) of a running *bash* script.
getbashscript() {
pgrep -lf "(^|/)bash( | .*/)$1( |\$)"
}
Si vous êtes prêt à formuler d'autres hypothèses, telles que des chemins d'interpréteur de script ne contenant jamais d'espaces incorporés, vous pouvez rendre les expressions rationnelles plus restrictives et ainsi réduire davantage le risque de faux positifs.
La dernière réponse de mklement0 m'a beaucoup inspirée. J'ai quelques scripts/petits programmes à exécuter à chaque redémarrage via /etc/crontab
. Je me suis inspiré de sa réponse pour créer un script de connexion qui indique si mes programmes sont toujours en cours d'exécution. J'exécute ce scripts.sh
via .profile
-file à chaque connexion pour obtenir une notification instantanée à chaque connexion.
cat scripts.sh
#!/bin/bash
getscript() {
pgrep -lf ".[ /]$1( |\$)"
}
script1=keepalive.sh
script2=logger_v3.py
# test if script 1 is running
if getscript "$script1" >/dev/null; then
echo "$script1" is RUNNING
else
echo "$script1" is NOT running
fi
# test if script 2 is running:
if getscript "$script2" >/dev/null; then
echo "$script2" is RUNNING
else
echo "$script2" is NOT running
fi
pgrep -f aa.sh
Pour faire quelque chose avec l'identifiant, vous le dirigez. Ici, je tue toutes ses tâches enfants.
pgrep aa.sh | xargs pgrep -P ${} | xargs kill
Si vous voulez exécuter une commande si le processus est en cours, faites ceci:
pgrep aa.sh && echo Running
Donnez une option à ps pour afficher tous les processus, un exemple est:
ps -A | grep "myshellscript.sh"
Vérifiez http://www.cyberciti.biz/faq/show-all-running-processes-in-linux/ pour plus d'informations
Et comme Basile Starynkevitch l’a mentionné dans le commentaire pgrep
, il existe une autre solution.