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?
risposta
È 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)
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
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
Quindi vuoi dire che non può richiedere l'input dell'utente ma puoi farlo riportare cosa sta facendo, per esempio? – user1166981
è possibile utilizzare schermo comando. here is a tutorial. si noti che potrebbe essere necessario installarlo sui vostri sistemi.
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.
Come si esegue il programma utilizzando nohup? Ciò ha implicazioni negative per l'interazione con il programma all'interno della shell? Grazie – user1166981
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
Oh, ma il tuo programma è interattivo. In questo caso hai bisogno di schermo. – Joni
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.
Sfortunatamente, non sarai in grado di interagire con il programma. – BRFennPocock
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
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 ...
In tutta onestà mi piacerebbe implementare la soluzione da C piuttosto che basarsi sui programmi esistenti sulla scatola. – user1166981
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...
È 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
Una soluzione migliore potrebbe essere chiamare la funzione 'daemon'. –
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
- 1. come eseguire un comando al terminale dal programma java?
- 2. Come mantenere un server Websocket in esecuzione, anche dopo aver chiuso il terminale SSH?
- 3. dopo aver aperto processo terminale si chiude e non può accedere di nuovo terminale
- 4. Come eseguire il codice Ruby dal terminale?
- 5. Programma terminale porta COM
- 6. Come eseguire un programma CLion nel terminale Gnome?
- 7. È possibile eseguire il cout del terminale durante il reindirizzamento di cout in outfile?
- 8. python3 scompone il terminale
- 9. sftp a riga singola dal terminale
- 10. Come eseguire un programma dall'ingresso del terminale (linux)?
- 11. Come eseguire il mio file php dal terminale mac
- 12. Rendi l'output del programma curses persistente nella cronologia di scrollback del terminale dopo l'uscita dal programma
- 13. Come inviare e-mail dal terminale?
- 14. Eseguire uno script di shell nel nuovo terminale dal terminale corrente
- 15. Come aprire un URL dal terminale
- 16. Impossibile aprire il terminale cygwin dopo l'installazione
- 17. Come continuare l'esecuzione del programma anche dopo aver lanciato un'eccezione?
- 18. Modificare l'app terminale per il terminale di avvio rapido Docker
- 19. Processo in esecuzione in background dopo la chiusura del terminale
- 20. PHP - Esegue il codice dal terminale, server ubuntu
- 21. Come si avvia un comando dal terminale in modo che il terminale non sia il genitore?
- 22. Che cosa può far continuare a funzionare Java dopo System.exit()?
- 23. Fine programma dopo MessageBox è chiuso
- 24. assicurandosi che il programma sia in un terminale
- 25. Come posso mantenere attivo il mio server Django anche dopo aver chiuso la sessione ssh?
- 26. Continuare a eseguire il debug dopo l'asserzione fallita su Linux?
- 27. Scrive sul terminale dopo aver reindirizzato lo stdout in un file senza utilizzare stderr?
- 28. variabile d'ambiente non è impostata sulla sessione terminale dopo aver impostato con pacchetto "os"
- 29. scrolling down git diff dal terminale mac
- 30. Costruisci/esegui il progetto iOS Xcode dal Terminale
Perché "in C"? Perché una soluzione in Perl non va bene? ?? – pmg
Speravo di mantenere tutto il codice all'interno del programma stesso che è codificato in C. – user1166981