Usiłuję sprawdzić, czy proces (zakładając, że się nazywa some_process
) jest uruchomiony na serwerze. Jeśli tak, to echo 1, w przeciwnym razie echo 0.
To polecenie, którego używam, ale działa tylko częściowo (więcej informacji poniżej). Zauważ, że muszę napisać skrypt w jednym wierszu.
ps aux | grep some_proces[s] > /tmp/test.txt && if [ $? -eq 0 ]; then echo 1; else echo 0; fi
Uwaga:[s]
w some_proces[s]
to, aby zapobiec grep
powrotowi się.
Jeśli some_process
jest uruchomiony, wyświetla "1"
się echo, co jest w porządku. Jeśli jednak some_process
nie działa, nic się nie odbija.
ps -Ccmd
do znalezienia procesów, których nazwa polecenia to „cmd”, co może całkowicie wyeliminowaćgrep
.ps
ustawi kod wyjścia na pewną niezerową wartość, jeśli nie uda się znaleźć pasującego procesu.Odpowiedzi:
Nie ma potrzeby jawnego sprawdzania
$?
. Po prostu zrób:Zauważ, że polega to na tym, że echo nie zawodzi, co z pewnością nie jest gwarantowane. Bardziej niezawodnym sposobem na napisanie tego jest:
źródło
echo 1
nie powiedzie,echo 0
zostanie wykonany. W takim przypadku echo 1 nigdy nie zawiedzie, ale zwróć uwagę, że A i B || C nie jest, jeśli-to-jeszcze. C może działać, gdy A jest prawdziwe. (Z kontroli powłoki ).if ps aux | grep some_proces[s]; then echo 1; else echo 0; fi
. Lokalnie wydaje mi się, że działa. Czy to dlatego, że OP miał przekierowanie w poleceniu, którego próbował?grep -q
lub przekierowane do / dev / null).pgrep
.&&
oznacza „a jeśli się powiedzie”; umieszczając swojeif
oświadczenie po prawej stronie, upewniasz się, że będzie działać tylko w przypadkugrep
zwrotów0
. Aby to naprawić, użyj;
zamiast tego:(lub po prostu użyj podziału linii).
źródło
Użyj,
grep -vc
aby zignorowaćgrep
daneps
wyjściowe i policzyć linie jednocześnie.źródło
Możesz w pełni korzystać z następujących operatorów
&&
i||
:Aby wykluczyć sam grep, możesz również zrobić coś takiego:
źródło
więcej onelinerów tutaj
źródło