Come ottenere il PID del comando prima in Pipeline


11

Sto scrivendo uno script bash da utilizzare inotifywaitper monitorare una directory e dare il via alle azioni quando vengono rilevate modifiche. Qualcosa di simile a:

inotifywait -m ... | while read f; do something; done

Poiché inotifywaitnon termina da solo, questo script non si arresterà.

Quindi il mio piano era di ottenere il PID del processo inotifywait, salvarlo in un file e fare in modo che un processo diverso lo uccidesse in seguito, ad esempio:

inotifywait -m ... | { echo ??PID?? > pid-file; while ... }

Ma non so come ottenere il PID. C'è un modo semplice per raggiungere questo obiettivo? Un altro modo è solo quello di salvare il PID dello shell-script $$nel file e uccidere l'intero shell-script, ma volevo fare un po 'di pulizia dopo il ciclo while.

Ho provato a usare coproce penso che funzionerà ma sembra più complicazioni del necessario.


Potresti usare qualcosa come questo `ps -ef | grep processName | grep -v grep | awk '{print $ 2}' | xargs kill -9 `
Kiwy

@Kiwy - invece di quel casino basta fare un pgrep inotifywait. Che vi darà il PID, per uccidere, pkill inotifwait.
slm

@slm a seconda del tuo sistema non avrai pgrep e pkill mentre grep e ps saranno quasi presenti. Non c'è di che
kiwy

@Kiwy - dubbioso, quegli strumenti sono abbastanza onnipresenti. Inoltre non è necessario fare un grep -v grep, invece ps -ef | grep [p]rocessname...farebbe lo stesso.
slm

1
@DavidsonChua: sì, è possibile utilizzare l' -finterruttore se è necessario abbinare più nome del file eseguibile.
slm

Risposte:


6

In una pipeline, tutti i processi vengono avviati contemporaneamente , non ce n'è uno precedente agli altri.

Potresti fare:

(echo "$BASHPID" > pid-file; exec inotifywait -m ...) | while IFS= read -r...

O portabilmente:

sh -c 'echo "$$" > pid-file; exec inotifywait -m ...' | while IFS= read -r...

Si noti inoltre che quando whiletermina la subshell che esegue il ciclo, inotifywaitverrebbe ucciso automaticamente la prossima volta che scrivesse qualcosa su stdout.


3

Se è necessario l'ID processo nel ciclo, stamparlo prima.

sh -c 'echo "$$"; exec inotifywait -m ...' | {
  read inotifywait_pid
  while IFS= read -r f; do
    
    if …; then kill "$inotifywait_pid"; break;
  done
}

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.