J'essaie de vérifier si un processus (supposons qu'il s'appelle some_process
) s'exécute sur un serveur. Si c'est le cas, alors écho 1, sinon écho 0.
C'est la commande que j'utilise mais elle ne fonctionne que partiellement (plus d'informations ci-dessous). Notez que je dois écrire le script sur une seule ligne.
ps aux | grep some_proces[s] > /tmp/test.txt && if [ $? -eq 0 ]; then echo 1; else echo 0; fi
Note: Le [s]
en some_proces[s]
est d'empêcher grep
de se retourner.
Si some_process
est en cours d'exécution, alors "1"
fait écho, ce qui est bien. Cependant, s'il some_process
n'est pas en cours d'exécution, rien ne se répercute.
ps -Ccmd
pour rechercher des processus dont le nom de commande est "cmd", ce qui peut éliminer complètement legrep
.ps
définira le code de sortie sur une valeur non nulle s'il ne trouve pas de processus correspondant.Réponses:
Il n'est pas nécessaire de vérifier explicitement
$?
. Faites juste:Notez que cela repose sur l'écho qui n'échoue pas, ce qui n'est certainement pas garanti. Un moyen plus fiable d'écrire ceci est:
la source
echo 1
échec, alorsecho 0
sera exécuté. Dans ce cas, l'écho 1 n'échouera jamais, mais notez que A && B || C n'est pas si-alors-sinon. C peut s'exécuter lorsque A est vrai. (À partir de shellcheck ).if ps aux | grep some_proces[s]; then echo 1; else echo 0; fi
. Localement, cela semble fonctionner pour moi. Est-ce parce que OP avait la redirection dans la commande qu'il a essayée?grep -q
ou redirigé vers / dev / null).pgrep
.&&
signifie "et en cas de succès"; en plaçant votreif
relevé à droite de celui-ci, vous vous assurez qu'il ne s'exécutera qu'en cas degrep
retour0
. Pour le réparer, utilisez;
plutôt:(ou utilisez simplement un saut de ligne).
la source
Utilisez
grep -vc
pour ignorergrep
laps
sortie et compter les lignes simultanément.la source
Vous pouvez utiliser pleinement les opérateurs
&&
et||
comme ceci:Pour exclure grep lui-même, vous pouvez également faire quelque chose comme:
la source
plus d'oneliners ici
la source