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.
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
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.
Forse puoi premere prima ctrl + z e inserire
fg; echo "first job finished"
È 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.
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
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
Ho avuto un problema simile e l'ho risolto in questo modo:
Nohup bash script1.sh &
aspettare
Nohup bash script2.sh &