2013-06-19 4 views
93

Я пытаюсь проверить, работает ли процесс (предположим, он называется some_process) на сервере. Если это так, то echo 1, иначе echo 0.Bash: If/Else statement в одной строке

Это команда, которую я использую, но она работает только частично (подробнее см. Ниже). Обратите внимание, что мне нужно написать скрипт в одной строке.

ps aux | grep some_proces[s] > /tmp/test.txt && if [ $? -eq 0 ]; then echo 1; else echo 0; fi 

Примечание:[s] в some_proces[s], чтобы предотвратить grep от возвращения себя.

Если some_process работает, то "1" получает эхо, что хорошо. Однако, если some_process не работает, ничего не получает.

+3

Вы можете использовать 'ps -Ccmd' для поиска процессов, имя команды которых« cmd », что может полностью исключить' grep'. 'ps' установит код выхода на некоторое ненулевое значение, если ему не удается найти соответствующий процесс. – rici

ответ

143

Нет необходимости явно указывать $?. Просто сделайте так:

ps aux | grep some_proces[s] > /tmp/test.txt && echo 1 || echo 0 

Обратите внимание, что это зависит от эха, не провалившегося, что, конечно же, не гарантируется. Более надежный способ написать это:

if ps aux | grep some_proces[s] > /tmp/test.txt; then echo 1; else echo 0; fi 
+3

Если 'echo 1' выйдет из строя, будет выполнено' echo 0'. В этом случае echo 1 никогда не сбой, но обратите внимание, что A && B || C не является if-then-else. C может выполняться, когда A истинно. (Из [shellcheck] (https://github.com/koalaman/shellcheck)). – schemacs

+0

@schemacs делает очень актуальную точку: редактирование, чтобы обеспечить гораздо лучшую альтернативу. –

+2

Нужно ли перенаправить вывод команды ps в файл? Не будет ли это работать? 'if ps aux | grep some_proces [s]; затем echo 1; else echo 0; fi'. На местном уровне это работает для меня. Это потому, что ОП имел перенаправление в команде, которую он пытался? –

35

&& означает «и в случае успеха»; разместив свой оператор if с правой стороны, вы убедитесь, что он будет работать только в том случае, если grep возвращает 0. Чтобы исправить это, используйте ; вместо:

ps aux | grep some_proces[s] > /tmp/test.txt ; if [ $? -eq 0 ]; then echo 1; else echo 0; fi

(или просто использовать разрыв строки).

+3

+1 Это гораздо лучший ответ, так как он фактически отвечает на вопрос, а не просто дает альтернативу. –

10

Вы можете в полной мере использовать && и || операторов, как это:

ps aux | grep some_proces[s] > /tmp/test.txt && echo 1 || echo 0 

Для исключения Grep себя, вы также можете сделать что-то вроде:

ps aux | grep some_proces | grep -vw grep > /tmp/test.txt && echo 1 || echo 0 
+0

Именно то, что я искал, спасибо. – EternalHour

22

grep -vc Использование игнорировать grep в ps выходе и подсчета линий одновременно.

if [[ $(ps aux | grep process | grep -vc grep) > 0 ]] ; then echo 1; else echo 0 ; fi 
Смежные вопросы