web-dev-qa-db-fra.com

Commande Linux pour vérifier si un script Shell est en cours d'exécution ou non

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.

23
learninghuman

Vérifie ça

ps aux | grep "aa.sh"
26
krizna

La solution la plus simple est:

pgrep -fl aa.sh
25
Gilles Quenot

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
5
Raj

Vérifie ça

ps -ef | grep shellscripname.sh

Vous pouvez également trouver votre processus en cours dans 

ps -ef
4
Saurabh Lende

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
  • La correspondance est sensible à la casse (sur macOS, vous pouvez ajouter -i à l'appel pgrep pour le rendre sensible à la casse -in, ce qui n'est pas une option sous Linux.)
  • La fonction 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.
  • Même cette fonction ne peut pas exclure tous les faux positifs , car les chemins peuvent avoir des espaces incorporés, cependant ni 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.
  • Une autre approche pour minimiser le risque de faux positifs pourrait être de faire correspondre le nom de exécutable (c'est-à-dire un interprète, tel que 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.

2
mklement0

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
2
rj45
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
2
Prashant Kandathil

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.

0
lc2817