Ctrl + c in un processo secondario sta uccidendo un processo nohup in precedenza nello script


15

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 followquel 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 lesscomando (per fermarsi tailing) in qualche modo uccide il server iniziato con nohupin 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 ^Centro 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 ^Gper sostituire il comando di interruzione, ma poi ctrl+ ha gfatto esattamente quello che ^Cstava facendo comunque (quindi potrebbe essere un problema con il mio emulatore di terminale; konsole)

  • posizionando la nohup& / o la lesslinea tra parentesi (per renderla una subshell)

  • eseguendo lo script xterminvece dikonsole


Qualcuno potrebbe aver riscontrato il mio problema; I think it is due to the handling within the database software, not on the shell. Come farebbe un programma? Come potrei quindi fermarlo?
Hashbrown,

3
nohupimpedisce al processo di ricevere il SIGHUPsegnale mentre CTRL + C invia il SIGINTsegnale. Ecco perché nohupnon ha l'effetto che ti aspettavi.
Piotr Dobrogost,

Risposte:


11

Avevo ragione nel pensare che SIGINTfosse inviato a tutti i processi quando ctrl+ c, ma ero sciocco nel pensare che fare un altro processo l'avrebbe portato fuori dal process group(vedi i miei tentativi nel P.P.S.).

Questo non è solo il caso d'uso esatto, ma la soluzione corretta.

A causa di come la mia sceneggiatura era strutturata, la risposta lì non si adattava alla lettera, questa è la sceneggiatura ora;

#/bin/bash

setsid {SERVERCOMMAND} > currentOutput.log 2>&1 &
less +F currentOutput.log

Il server continua a essere emesso nel file di registro dopo I ctrl+ cin less.

Grazie per il tempo di tutti.


0

Hai provato a rinnegare ?

  disown -h %1

o qualunque sia il tuo lavoro; disown è una shell integrata, la sua pagina man afferma:

rinnegare

disown [-ar] [-h] [jobspec ...]

Senza opzioni, ogni jobspec viene rimosso dalla tabella dei lavori attivi. Se l' opzione -h' option is given, the job is not removed from the table, but is marked so that SIGHUP is not sent to the job if the shell receives a SIGHUP. If jobspec is not present, and neither the-a 'né -r' option is supplied, the current job is used. If no jobspec is supplied, the-a' significa rimuovere o contrassegnare tutti i lavori; l'opzione `-r 'senza un argomento jobspec limita l'operazione ai lavori in esecuzione.

MODIFICARE

Cosa divertente, i tuoi lavori di costruzione sul mio Arch Linux:

 $ cat testm
  #!/bin/sh

  nohup /home/mario/temp/waste & 

  less +F out.log

 $ cat waste
  #!/bin/sh

  while [ 1 ]; do
    find / -print 2>1 1> out.log
  done
  $ ./testm
   nohup: appending output to nohup.out
  $ ps ax | grep waste
    19090 pts/2    S      0:00 /bin/sh /home/mario/temp/waste
    19124 pts/2    S+     0:00 grep waste]
  $

Prima del comando ps , dovevo scorrere il file out.log, quindi Ctrl+C, quindi q.


si, ma non so come applicarlo. Ho provato a mettere la nohuplinea in una funzione che a sua disownsvolta, ma dovrebbe essere la stessa nohup. Non penso che questo sia un SIGHUPproblema, poiché quando rimuovo la lessriga, lo script si conclude con il server ancora in esecuzione
Hashbrown,

@Hashbrown vedi la mia modifica
MariusMatutiae,

Sì, ho anche fatto un test, con un semplice script bash chiamato invece dell'eseguibile {SERVER}. E nohup ha funzionato bene. Vedi il mio commento sulla domanda. Penso che stia ascoltando intenzionalmente in qualche modo. Dal momento che è un server di proprietà (e non ben noto) non posso nemmeno dire cosa sia così qualcuno può andare "oh sta facendo X, devi fare Y"
Hashbrown,
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.