Lo script Bash dovrebbe uccidere solo quelle istanze di un altro script che ha avviato


11

Nella situazione attuale, un certo script "calling.sh" avvia un altro script "chiamato.sh" in background, esegue altre operazioni, dorme per un po 'e quindi termina "chiamato.sh" con a pkill called.sh. Funziona benissimo.

Quindi, vorrei anche avviare "called.sh" da altri terminali come script autonomo in qualsiasi altro momento, prima o dopo l'avvio di calling.sh. Queste istanze indipendenti non dovrebbero essere eliminate da 'calling.sh'.

Come posso raggiungere questo obiettivo? Intuition afferma che lo script chiamante dovrebbe essere in grado di dire al processo che è iniziato da tutti gli altri omonimi che sono in esecuzione nel frattempo.

Come variante, "calling.sh" può anche avviare "chiamato", che è un collegamento simbolico a "chiamato.sh". Questo complica la gestione della situazione di cui sopra? Quali precauzioni e regolazioni specifiche richiede l'uso di un collegamento simbolico?


1
Credo che unshare sia specifico per questo: unix.stackexchange.com/a/450242/323121
Rusi

Risposte:


27

Non usare il nome per ucciderlo. Poiché lo calling.shscript chiama il processo che in seguito desideri terminare, usa $!(da man bash):

! Si espande nell'ID processo del lavoro più recentemente inserito in background, sia eseguito come comando asincrono o utilizzando il comando bgincorporato

Quindi, se sei calling.shcosì:

called.sh &
## do stuff
pkill called.sh

Modificalo in questo:

called.sh &
calledPid=$!
# do stuff
kill "$calledPid"

4
Questo dovrebbe funzionare fino a quando chiamato.sh non muore da solo, perché altrimenti il ​​suo pid potrebbe essere riutilizzato, uccidendo di conseguenza un processo innocente e non correlato.
Eugene Ryabtsev,

2
@EugeneRyabtsev è un ottimo punto. Immagino che potresti anche verificare che il $calledPidPID del genitore sia il PID di called.sh.
terdon

Per rafforzare la risposta, questa è un'altra risorsa che ho trovato utile per organizzare i miei pensieri: mywiki.wooledge.org/ProcessManagement
XavierStuvw

18

Ho dovuto scegliere questo ma tra gli script così tante volte; è ancora più divertente quando gli script vengono chiamati come parte di un programma automatizzato complesso. Non dovresti davvero fare affidamento su qualcosa come pkillselezionare quale script uccidere.

All'interno di calling.sh dovresti registrare i PID dei lavori che hai avviato e ucciderli esplicitamente tramite PID.

Inside calling.sh:

./called.sh &
called_pid=$!

# Later
kill $called_pid
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.