Uso spesso bash
script di shell per eseguire semplici comandi per molti file diversi. Per esempio, supponiamo che io ho il seguente bash
script di shell, chiamato script.sh
, che esegue il comando / programma foo
su tre file di testo "a.txt"
, "b.txt"
, "c.txt"
:
#!/bin/bash
for strname in "a" "b" "c"
do
foo $strname".txt"
done
Supponiamo inoltre che foo $strname".txt"
sia lento, quindi l'esecuzione dello script richiederà molto tempo (ore o giorni, ad esempio). Per questo motivo, vorrei utilizzarlo in nohup
modo che l'esecuzione continui anche se il terminale è chiuso o disconnesso. Vorrei anche che lo script passasse immediatamente in background, quindi userò l' &
operatore. Quindi userò il seguente comando per chiamare script.sh
:
nohup bash script.sh &
Questo funziona bene per l'esecuzione dello script in background e senza riaggancio, ma ora supponiamo che vorrei terminare l'esecuzione ad un certo punto per qualche motivo. Come posso fare questo?
Il problema che ho riscontrato è che, guardando top
, vedo solo il foo
corrispondente "a.txt"
. Posso terminare quella foo
chiamata, ma poi viene chiamato il foo
corrispondente a "b.txt"
e poi devo terminare anche quella, e così via. Per decine o centinaia di file di testo specificati nel for
loop, diventa una seccatura terminare ogni foo
uno a uno! Quindi, in qualche modo, devo invece terminare lo script di shell stesso , non le chiamate particolari emesse dallo script di shell.
Quando scrivo il comando
ps -u myusername
dov'è il myusername
mio nome utente, ottengo un elenco di processi che sto eseguendo. Ma vedo due diversi ID processo chiamati bash
. Come faccio a sapere quale di questi processi, se presente, corrisponde alla mia chiamata originale nohup bash script.sh &
?
for s in a b c; do foo "$s".txt; done
nohup
sarà passato da tempo quando apri un elenco dei processi per vedere il lavoro che hai iniziato. Puoi guardare la colonna "gentilezza" ps
nell'output ma le risposte qui sono più utili.