Piszę skrypt bash inotifywait
do monitorowania katalogu i rozpoczynania akcji po wykryciu zmian. Coś jak:
inotifywait -m ... | while read f; do something; done
Ponieważ inotifywait
skrypt nie zakończy się sam, skrypt nie zostanie zatrzymany.
Tak więc moim planem było uzyskanie PID procesu inotifywait, zapisanie go do pliku i inny proces zabił go później, powiedzmy:
inotifywait -m ... | { echo ??PID?? > pid-file; while ... }
Ale nie wiem, jak uzyskać PID. Czy istnieje prosty sposób na osiągnięcie tego? Innym sposobem jest po prostu zapisanie PID skryptu powłoki $$
w pliku i zabicie całego skryptu powłoki, ale chciałem trochę wyczyścić po pętli while.
Próbowałem używać coproc
i myślę, że to zadziała, ale wydaje się, że jest to bardziej skomplikowane niż to konieczne.
pgrep inotifywait
. Który daje PID, aby zabićpkill inotifwait
.grep -v grep
, zamiast tegops -ef | grep [p]rocessname...
zrobiłbyś to samo.-f
przełącznika, jeśli chcesz dopasować do większej liczby nazw plików wykonywalnych.Odpowiedzi:
W potoku wszystkie procesy są uruchamiane jednocześnie , nie ma takiego, który jest wcześniejszy niż inne.
Mógłbyś:
Lub przenośnie:
Zauważ również, że kiedy podpowłoka, która uruchamia
while
pętlę,inotifywait
zostanie automatycznie zabita, gdy następnym razem napisze coś na standardowe wyjście.źródło
Jeśli potrzebujesz identyfikatora procesu w pętli, najpierw go wydrukuj.
źródło
Ta odpowiedź SO wydaje się mieć zastosowanie:
źródło