2010-12-14 4 views
5

Ogni sessione che comincio con "-d -m" non accetta "roba -X [...]" comandi a meno che non Ho attaccato allo schermo almeno una volta. Non c'è un messaggio di errore, i comandi non riescono a passare.Come posso inviare comandi roba da una schermata iniziale in-indipendente?

Il problema è che mi metto la sessione da un lavoro cron e sono in grado di collegare allo schermo dall'interno cron.

Procedura per ripetere

$ screen -m -d -S mydaemon bash 
$ screen -S mydaemon -X stuff "`printf "exit\\r"`" 
$ screen -ls 
     32456.mydaemon (Detached) 
$ screen -r -S mydaemon 
$ ^a d 
$ screen -S mydaemon -X stuff "`printf "exit\\r"`" 
$ screen -ls 
No Sockets found in /var/run/screen/S-user 

^a d indica premendo Ctrl + A D quindi premendo.

Versioni

CentOS release 5.5 (Final) 
Screen version 4.00.03 (FAU) 23-Oct-06 

risposta

8

Edit: La migliore risposta a questa domanda è this other SO answer. Lascio la mia soluzione kludgey qui, comunque, nel caso in cui ispira una soluzione ad un problema simile.


Una possibile soluzione è quella di utilizzare un secondo, già in esecuzione e sessione di screen distaccata per iniziare la sessione di screen a cui si desidera inviare il comando "roba" in modalità collegata, e quindi inviare la sessione schermo un distacco comando e poi il comando stuff.

$ screen -dmS spawner 
$ screen -S spawner -X screen screen -dR mydaemon 
$ sleep 1 # may be necessary 
$ screen -S mydaemon -X detach 
$ screen -S mydaemon -X stuff "whatever" 

(Nota: la "schermata" raddoppiato è non un errore di battitura!) Si sono ancora a sinistra con una sessione di screen unstuffable (spawn), ma se le risorse che ci vuole sono importanti si può sempre e solo usare "kill -TERM ..." o la sua ilk di porvi fine (o lo hanno abbandonato automaticamente dopo un certo periodo di tempo iniziando con qualcosa come

$ screen -dmS spawner bash -c "sleep 60" 

o simili).

+0

Grazie mille, sei fantastico! –

+1

Grazie per l'incoraggiamento. quella Ho dovuto aggiungere un breve sonno dopo aver creato la sessione dello schermo e il suo distacco tramite -X, per evitare condizioni di gara. La risposta è stata modificata per riflettere questo. –

0

Hai pensato di usare tmux invece? È molto più adatto a compiti non interattivi.

+0

Io attualmente non ho tmux installato ma posso guardare dentro. C'è una guida o può fornisci un esempio per ciò di cui ho bisogno? –

+0

'man tmux' praticamente copre tutto, ma questo dovrebbe essere praticamente identico a quello che vuoi: http://blog.hawkhost.com/2010/07/02/tmux-% E2% 80% 93-the-terminal-multiplexer-parte-2/# tmux-shell-scripting –

-1

Utilizzando il file Screenrc, è possibile impostare le cose per iniziare;

screen -t <title> <window position> <command> 

Quindi, se si voleva iniziare top nella finestra di 7, faresti

screen -t window7top 7 top 
+0

La tua risposta non è applicabile –

0

Grazie per Ron Kaminsky.

ho trovato un altro modo per uccidere schermo 'spawner'

$ screen -dmS spawner 
    $ screen -S spawner -X screen screen -dR mydaemon 
    $ sleep 1 # may be necessary 
    $ screen -S mydaemon -X detach 

e aggiungere sotto la linea

$ screen -S mydaemon -X screen screen -S spawner -dR 
    $ sleep 1 # may be necessary 
    $ screen -S spawner -X detach 
    $ screen -S spawner -X kill 
+0

Ad ogni modo, non posso aggiungere commenti ad un altro ragazzo. cosa mi succede :( –

0

schermo -d -m/bin/bash "test.sh"

schermo (monofamiliare) (mobile) (shell) 'Cosa eseguire'

$ screen -d -m /bin/bash "test.sh" 
$ screen -li 
There is a screen on: 
     8540..Satelite (10/17/2013 04:53:22 AM)  (Detached) 
1 Socket in /var/run/screen/S-matt.