Come eseguire un comando sullo schermo e staccarlo?


75

Come posso ottenere lo schermo per eseguire un comando e quindi staccarlo (ovvero automaticamente in un singolo script senza ulteriori input oltre l'avvio iniziale dello script)? ad es. eseguo myscript.sh e avvia automaticamente una sessione dello schermo, esegue un comando, quindi si stacca.

Risposte:


114

Questo è facile:

screen -d -m yourcommand

4
niente da fare. screen -d -m command, screen -list dice no socket, screen -r no session
darkfeline

1
In qualche modo il tuo comando non è stato trovato o non funziona correttamente nell'ambiente dello schermo creato automaticamente. Prova a fare solo screen yourcommandsenza -de -me vedi come va prima.
Alan Curry,

Hai ragione. lo schermo termina quando termina il comando, contrariamente alle mie aspettative. Ma la tua risposta funziona.
darkfeline,

3
Puoi cambiarlo abilitando l' zombieopzione nella schermata. Inserisci il zombie xytuo ~/.screenrc. Dovrebbe anche essere possibile abilitarlo solo per una sessione b inserendo zombie xyun altro file e usando -c filema per qualche motivo non funziona quando lo provo. O semplicemente usash -c 'yourcommand;while :;do sleep 9999; done'
Alan Curry il

@AlanCurry, No, neanche questo funziona per me, anche se il comando funziona perfettamente (e richiede diverse ore) quando viene eseguito manualmente in una schermata.
Cerin,

47

Per eseguire un singolo comando nella schermata e staccarlo, puoi provare:

screen -dm sleep 10

Per eseguire più comandi, prova:

screen -dm bash -c "sleep 10; myscript.sh"

Si noti che quando un programma termina, lo schermo (per impostazione predefinita) uccide la finestra che lo conteneva.

Se non vuoi che la tua sessione venga uccisa al termine dello script, aggiungi exec shalla fine, ad esempio:

screen -dm bash -c 'sleep 5; exec sh'

Per elencare tutte le sessioni, prova:

screen -list

Correlati: Avvia schermo Unix, Esegui comando, Stacca .


2
Questo ha funzionato per me su Ubuntu 16.04. Oltre a nominare la sessione in modo da poter tornare in un secondo momento, aggiungere -S sessionname: screen -dmS MyLongRunningScript bash -c "...".
Dan Dascalescu

16

Per iniziare una nuova sessione in background con il nome "assonnato"

screen -S sleepy -dm sleep 60

Per uccidere la sessione "assonnata"

screen -S sleepy -X quit      

perché non funziona così screen -S sleepy -dm "cd myfolder;sleep 60"?
Toolkit,

@Toolkit Il problema è che hai il comando tra virgolette e quindi è stato trattato come un unico comando di grandi dimensioni. Ovviamente non possiamo toglierlo dalle virgolette a causa del punto e virgola. Per risolvere questo, eseguire il comando in questo modo: screen -S sleepy -dm bash -c "cd myfolder; sleep 60"
Jason Thompson

3
screen -dmS screen_session_name bash -c 'echo "doing stuff"; exec bash'

0

mi capita quando premo control c (sig int) per uscire dal mio programma. esce completamente da tutte le bash. quindi ho trovato questo per catturare SIGINT. e impedire l'uscita dall'ultima bash. (è necessario digitare exit per uscire)

screen -dmS "screenNameHere" bash -c "trap 'echo gotsigint' INT; cd /mydir ; my_command_here;  bash"


example:

screen -dmS "status_updates" bash -c "trap 'echo gotsigint' INT; cd /opt/status_update ; forever index.js ;  bash"

Trovo utile usare cron per eseguire i programmi nodejs all'avvio. e per eseguire lo schermo all'avvio. in cron ci sono sintassi degli eventi speciali @reboot event

to edit cron, execute:
crontab -e

then type
@reboot screen -dmS "screenNameHere" bash -c "trap 'echo gotsigint' INT; cd /mydir ; my_command_here;  bash"
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.