Non sapevo se questo appartenesse a SO (in quanto è un bug di codifica) ma pensavo che voi ragazzi sareste più informati riguardo alle sottigliezze del software utilizzato (quindi forse anche U&L potrebbero essere considerati).
Ecco lo script di codice minimo (vedi le modifiche per lo script completo, c'è una ragione per cui lo sto facendo in questo modo);
#/bin/bash
nohup {SERVERCOMMAND} > currentOutput.log 2>&1 &
less +F currentOutput.log
Ciò che tenta di fare è eseguire un server in background, che genera un file di registro.
Quindi ho follow
quel file di registro usando less +F
. Mentre lo fai, per uscire da questo devi premere ctrl+ cprima di poter premere Q.
Quello che succede è che quando I ctrl+ call'interno del less
comando (per fermarsi tailing
) in qualche modo uccide il server iniziato con nohup
in alto! Nient'altro è interessato. Posso shift+ fper ricominciare a seguire il registro (che non riceve nuove informazioni da quando il server viene ucciso) e se premo Qil resto dello script viene eseguito normalmente.
Sai perché questo accade? Come evitarlo / qualcos'altro che dovrei usare?
PS
Il programma server potrebbe essere in attesa di a ^C
, che potrebbe essere il problema; c'è qualcosa che posso fare per fermarlo? Ad esempio, quando corro {SERVERCOMMAND}
da solo (in modo bloccante), posso premere ctrl+ c, che non lo uccide immediatamente; stampa Received ^C signal, shutting down
(e poi si uccide). Questo è ciò che sta accadendo quando ^C
entro less
(un finale Received ^C signal, shutting down
è scritto nel registro).
PPS
Ho provato diverse cose (nessuna ha funzionato);
cercando di disconnettere lo stdin dallo script cambiando
nohup {SERVERCOMMAND} > currentOutput.log 2>&1 & to nohup echo '' | {SERVERCOMMAND} > currentOutput.log 2>&1 & or nohup cat /dev/null/ | {SERVERCOMMAND} > currentOutput.log 2>&1 &
usando
stty intr ^G
per sostituire il comando di interruzione, ma poi ctrl+ ha gfatto esattamente quello che^C
stava facendo comunque (quindi potrebbe essere un problema con il mio emulatore di terminale;konsole
)posizionando la
nohup
& / o laless
linea tra parentesi (per renderla una subshell)eseguendo lo script
xterm
invece dikonsole
nohup
impedisce al processo di ricevere il SIGHUP
segnale mentre CTRL + C invia il SIGINT
segnale. Ecco perché nohup
non ha l'effetto che ti aspettavi.
I think it is due to the handling within the database software, not on the shell
. Come farebbe un programma? Come potrei quindi fermarlo?