risposta-alla-domanda-sullo-sviluppo-web-bd.com

Avvia lo script dopo un altro (già in esecuzione) finisce

Quindi ho un processo in esecuzione e ci vorranno diverse ore per essere completato. Vorrei iniziare un altro processo subito dopo aver finito, automaticamente. Si noti che non è possibile aggiungere una chiamata al secondo script nel primo, né crearne un altro che esegua in sequenza entrambi. C'è un modo per farlo in Linux?

Modifica: un'opzione è il polling di ogni x minuti usando pgrep e controlla se il processo è finito. Se lo ha fatto, inizia l'altro. Tuttavia, non mi piace questa soluzione.

PS: Entrambi sono script di bash, se questo aiuta.

48
skd

Polling è probabilmente la strada da percorrere, ma non deve essere orribile.

pid=$(ps -opid= -C your_script_name)
while [ -d /proc/$pid ] ; do
    sleep 1
done && ./your_other_script
26
Sorpigal

Dato il PID del primo processo, il ciclo

while ps -p $PID; do sleep 1; done ; script2

dovrebbe fare il trucco Questo è un po 'più stabile rispetto ai nomi di processo e pgrep.

51
thiton

Forse puoi premere prima ctrl + z e inserire

fg; echo "first job finished"
22
Yangchuan Li

È possibile eseguire wait processo già in esecuzione utilizzando il comando integrato di bash wait. man bash .

wait [n ...] Attende ogni processo specificato e restituisce il suo stato di terminazione. Ogni n può essere un ID di processo o una specifica di lavoro; se viene fornita una specifica di lavoro, tutti i processi nella pipeline di quel lavoro sono atteso per. Se n non è dato, tutti i processi figli attualmente attivi sono attesi, e lo stato di ritorno è zero. Se n specifica un processo o lavoro inesistente, lo stato di ritorno è 127. Altrimenti, il lo stato di ritorno è lo stato di uscita dell'ultimo processo o del lavoro in attesa per.

19
ks1322

Spesso accade che il tuo programma stia eseguendo diversi demoni. In quel caso il tuo pid sarà un array. Basta usare:

PID = ($ (pidof -x nome_processo)) #questo salva tutti i PID del processo specificato nell'array $ pid

Adesso basta modificare il codice di thiton come: 

while ps -p ${PID[*]}; do sleep 1; done ; script2

2
shivams

Ho avuto lo stesso requisito e l'ho risolto nel modo seguente:

while [[ "$exp" != 0 ]]; do
exp=$(ps -ef |grep -i "SCRIPT_1" |grep -v grep |wc -l)
sleep 5;
done

chiama SCRIPT_2

0

Ho avuto un problema simile e l'ho risolto in questo modo:

Nohup bash script1.sh &

aspettare

Nohup bash script2.sh &

0
Servando Flores