2012-01-27 12 views
5

Ho scritto un programma che eseguo dopo la connessione al box su SSH. Ha alcune interazioni con l'utente, come la selezione delle opzioni dopo la richiesta, e di solito aspetto che i processi vengano completati prima di uscire, che chiude il terminale e termina il programma. Ma ora il processo è piuttosto lungo e non voglio aspettare durante l'accesso, quindi come posso implementare una soluzione alternativa per questo in C, per favore?È possibile eseguire un programma dal terminale e farlo continuare a funzionare dopo aver chiuso il terminale?

+0

Perché "in C"? Perché una soluzione in Perl non va bene? ?? – pmg

+0

Speravo di mantenere tutto il codice all'interno del programma stesso che è codificato in C. – user1166981

risposta

7

È possibile eseguire un programma in background, seguendo il comando con "&"

wget -m www.google.com &

In alternativa, è possibile utilizzare il "schermo" il programma, che consente di collegare-deattach sessioni

schermo wget -m www.google.com

(Premere CTRL + D)

screen -r (TO RE ALLEGARE)

http://linux.die.net/man/1/screen

+0

Quindi se dovessi eseguire il programma come ./program & potrei comunque interagire con il programma come normale, ma quando chiudo il il terminale è ancora in esecuzione in background anche dopo la disconnessione? – user1166981

+3

No, se si esegue il programma con "&" verrà buttato in background, ma verrà comunque inviato al terminale, ma non sarà possibile interagire con esso. Continuerà a funzionare dopo la chiusura del terminale. Per quello che stai descrivendo, suggerirei sicuramente di usare lo "schermo" - è incredibilmente utile. – Seidr

+0

Quindi vuoi dire che non può richiedere l'input dell'utente ma puoi farlo riportare cosa sta facendo, per esempio? – user1166981

1

è possibile utilizzare schermo comando. here is a tutorial. si noti che potrebbe essere necessario installarlo sui vostri sistemi.

2

Il processo invia il segnale HUP all'uscita dalla shell. Tutto quello che devi fare è installare un gestore di segnale che ignori SIGHUP.

Oppure basta eseguire il programma utilizzando nohup.

+0

Come si esegue il programma utilizzando nohup? Ciò ha implicazioni negative per l'interazione con il programma all'interno della shell? Grazie – user1166981

+0

La sintassi sarebbe "argomenti comando nohup". Le implicazioni includono l'output del programma che viene scritto in un file chiamato nohup.out - a meno che non lo si reindirizzi su un file diverso- e che stdin non sia connesso al terminale. – Joni

+1

Oh, ma il tuo programma è interattivo. In questo caso hai bisogno di schermo. – Joni

1

Il modo tradizionale di farlo è usare il nohup (1) di comando:

nohup mycmd </dev/null>& output.log & 

Naturalmente se non vi interessa circa l'uscita è possibile inviarlo a/dev/null troppo, o si potrebbe prendere input da un file se lo si desidera.

In questo modo si proteggerà il processo da un SIGHUP che normalmente causerebbe l'uscita. Dovrai anche reindirizzare stdin/stdout/stderr come sopra, dato che terminerai la tua sessione ssh.

La sintassi mostrata sopra è per bash.

+0

Sfortunatamente, non sarai in grado di interagire con il programma. – BRFennPocock

+0

Questo è vero - inizialmente ho perso quella parte della domanda. Tuttavia, se l'interazione avviene in modo prevedibile, l'input dell'utente può essere inserito in un file e il file viene reindirizzato su stdin. – FatalError

0

Ci sono molte opzioni :-) TIMTOWTDI ... Tuttavia, ai fini dell'utente, è possibile esaminare l'esecuzione di un'utilità della riga di comando come dtach o GNU screen.

Se si vuole realmente implementare qualcosa in C, si potrebbe re-inventare la ruota, ma dalla tua descrizione del problema, dubito che dovrebbe essere necessario ...

+0

In tutta onestà mi piacerebbe implementare la soluzione da C piuttosto che basarsi sui programmi esistenti sulla scatola. – user1166981

0

Il codice effettivo C a sfondo un processo è banale:

//do interactive stuff... 
if(fork()) 
    exit(0); 
//cool, I've been daemonized. 

Se si conosce il codice non potrà mai finire su una macchina non-linux-o-BSD, si potrebbe anche utilizzare daemon()

//interactive... 
daemon(0, 0); 
//background... 
+0

È davvero così semplice? Quindi posso averlo alla fine del mio programma e posso uscire dal terminale mentre sta ancora eseguendo processi in background (senza ulteriore output/stampa in input)? – user1166981

+0

Una soluzione migliore potrebbe essere chiamare la funzione 'daemon'. –

+0

Infatti. Puoi anche testarlo: 'main() {int k = getchar(); printf ("% c \ n", k); se (fork()) exit (0); pausa(); } 'quindi, chiudi il terminale e' ps ax | grep a.out'. Sarà chiaro come il giorno. – Dave

Problemi correlati