Czy mogę utworzyć linię poleceń bash, która uruchamia określone polecenie, tylko jeśli proces jeszcze nie działa (w tle)?
Jak sprawdzić *, jeśli polecenie jest już uruchomione?
(więc mogę dodać kolejne polecenie z &&
pomiędzy nimi, aby następne było wykonywane tylko wtedy, gdy pierwsze jest prawdziwe).
*: testuj, ustalaj, odkrywaj, dowiedz się
ps -ef | grep -v grep | grep "process_name" || run_command_here
pgrep "process_name"
zamiastps | grep | grep
Odpowiedzi:
Użyj daemontools . Możesz użyć,
svok
aby sprawdzić, czy proces usługi / demona / w tle jest obecnie uruchomiony.Inne metody patrz:
źródło
Od czasu do czasu korzystałem z tej techniki:
Wcześniej
pgrep
robiono to w ten sposób:przykład
Trochę z tym
[p]
sprawia, że tak sięgrep
nie stanie.źródło
Może to być trudne, ponieważ możesz mieć osobne instancje tego samego procesu, które działają niezależnie. Na przykład serwery nasłuchujące na różnych portach lub usługi działające jako różni użytkownicy. Aby rozróżnić te instancje, musisz przypisać każdemu z nich unikalny tag. Znacznik jest często plikiem, ale może być lokalnym gniazdem w abstrakcyjnej przestrzeni nazw, portem TCP itp. - wystarczy dowolny unikalny identyfikator. Gdy znacznik jest plikiem, może to być zwykły plik zawierający identyfikator procesu (plik pid) lub nazwaną potok lub gniazdo, na którym nasłuchuje plik itp. Idealnie, znacznik jest punktem końcowym komunikacji, który umożliwia klientom połączenie do tego procesu.
Każdy z tych rodzajów tagów powoduje inny sposób sprawdzenia, czy szukana instancja jest uruchomiona. Na przykład, z lokalnym gniazdem plików, spróbuj się z nim połączyć i rozpocznij proces, jeśli proces nie nasłuchuje na tym gnieździe. Jeśli znacznik jest plikiem pid, sprawdź, czy istnieje proces o tym identyfikatorze procesu, ale uważaj, aby był on delikatny, ponieważ jeśli proces umarł, może istnieć niepowiązany proces, który ponownie użył swojego identyfikatora. Uważaj, że jeśli dwóch klientów spróbuje dotrzeć do procesu w krótkim czasie, obaj mogą stwierdzić, że proces nie istnieje i obaj próbują go uruchomić; odpowiednia ochrona przed takimi warunkami wyścigowymi może być trudna.
Łatwiej jest zarządzać instancjami, gdy wszystkie są uruchamiane przez ten sam proces superwizora, a ten proces superwizora wykrywa moment śmierci instancji i odpowiednio reaguje. Wiele programów monitorujących usługi, które mogą to zrobić.
Jeśli program nie reaguje na znany punkt końcowy komunikacji i nie jest zarządzany przez program nadzorujący, znacznikiem biednego człowieka jest plik pid: plik zawierający identyfikator procesu. Po uruchomieniu procesu zapisz pid do pliku o wcześniej ustalonej nazwie. Gdy potrzebujesz, aby proces istniał, przeczytaj plik pid i sprawdź, czy istnieje proces z tym pid. Po zabiciu procesu usuń plik pid. Najistotniejszym problemem związanym z nienadzorowanym plikiem pid jest to, że jeśli proces umrze, jego pid może zostać ponownie wykorzystany przez jakiś niezwiązany proces. Powinieneś przynajmniej sprawdzić nazwę procesu lub plik wykonywalny procesu, aby upewnić się, że rozmawiasz z właściwym procesem. Wiele wariantów Uniksa ma polecenie pgrep :
pgrep SOMENAME
zawiera listę procesów, których nazwa zawiera SOMENAME jako podciąg, z dodatkowymi opcjami ograniczającymi do konkretnego użytkownika, wymagającymi dokładnego dopasowania, zmieniającymi, które z kilku możliwych pojęć „nazwa procesu” jest używana itp.źródło
Możesz użyć tego podejścia:
źródło
Inne opcje:
pgrep -xq processname
ps -eo comm= | sed 's|.*/||' | grep -xq processname
sed 's|.*/||'
usuwa części dirname w OS XW GNU / Linux
ps -o comm
obcięte nazwy poleceń do 15 znaków ipgrep
aps -C
jedynie dopasować pierwsze 15 znaków.ps -C
(dopasuj nazwy poleceń) nie jest obsługiwane w systemie OS X.W OS X
ps -o comm
drukuje bezwzględne ścieżki poleceń ips -co comm
drukuje tylko nazwy poleceń. W GNUps -o comm
drukuje tylko nazwy poleceń i-c
ma inne znaczenie.Pgrep w OS X nie obejmuje procesów przodków (takich jak bash, Terminal lub uruchomione) bez
-a
. Pgrep GNU zawiera je domyślnie i nie obsługuje-a
.grep -x
ipgrep -x
nie sugeruj-F
, więc użyj,-Fx
jeśli nazwa procesu może zawierać znaki regularne.źródło
Przykro mi, ale wszystkie te rozwiązania nie obsługują contab, ponieważ ta sama linia poleceń pojawi się dwukrotnie w wyniku „ps”.
Oto moje:
źródło
cron
pracy?Z Bash
Uwaga: - usuń,
echo
jeśli wyjście wygląda OK.źródło
Wyjaśnię przypadek, w którym uruchamiasz komendę w beckgreoud. „$!” zapisz PID ostatniego procesu w tle. Możesz więc użyć go do znalezienia go w tabelach procesów zgodnie z powyższymi odpowiedziami:
Wbudowane polecenie „jobs” - spróbuj tego:
Odnośnie opcji „&&”
Zamiast && użyj polecenia czekaj. W poniższym przykładzie myproc2 nie uruchomi się, dopóki myproc1 nie zakończy się:
źródło
Uzyskaj stan swojego procesu:
ps -lp $(pgrep <YOUR_PROCESS_NAME>) | tail -1 | awk '{print $11}'
Odniesienie:
Na przykład użyłem go do warunkowego odtworzenia lub wstrzymania mojego procesu sox na sesji tmux:
źródło
Możesz użyć go w skrypcie:
źródło