Esegui schermo (GNU) dallo script


11

Vorrei avviare alcune applicazioni all'interno della sessione dello schermo ma da uno script.
Senza script vorrei solo avviare la schermata, quindi aprire N windows con crtl-ac ed eseguire i programmi in ciascuna finestra.

Ho provato quanto segue

screen -d -m -S test
screen -S test -X exec tail -f /var/log/messages
screen -S test -X screen
screen -S test -X exec tail -f /var/log/xinetd.log

Ma quando allego la coda della sessione non è in esecuzione. Se allego la sessione subito dopo screen -d -m -S startupe corro screen -S startup -X exec tail -f /var/log/messagesda un altro terminale, funziona.

Ho dimenticato qualcosa ?

Modifica dopo la risposta AlexD:

Una soluzione funzionante a metà è

screen -d -m -S test tail -f /var/log/messages
screen -S test -X screen tail -f /var/log/xinetd.log

Il comando di concatenamento dello schermo (quello dopo -X) con il comando funziona mentre exec non è probabilmente perché exec si aspetta che venga definita una finestra corrente mentre non ce n'è una corrente quando lo schermo è staccato. Grazie ad AlexD per questi suggerimenti.

Ma c'è uno strano effetto collaterale: quando il programma si interrompe (se allego la sessione dello schermo e crtl-c la coda o uccidi la coda) la finestra dello schermo si chiuderà.
Quindi il comportamento non è lo stesso di Crtl-A c ed esegui il comando
Un altro effetto collaterale è che non puoi concatenare 2 comandi


screen sempre termina quando il comando con cui è stato lanciato estremità - si tratta di una caratteristica normale dello strumento :) ..quindi se si esegue screen top, quando si esce top, screensi chiuderà, anche
Warren

Sì, ora questo, è per questo che ho provato ad avviare lo schermo come Deamon, quindi utilizzare exec, quindi utilizzare il comando screen per aprire una nuova finestra (lanciando una shell). Ho anche provato a precedere bash tra exec e tail o tra screen e tell ma non funzionano nessuno
raggio

Risposte:


14

Il screen -S test -X screen commandcomando è quello che ti serve per aggiungere windows alla tua sessione demone, ma non per i motivi che dai. Funziona perché -X accetta un comando schermo e non un comando shell, e il comando schermo per creare una finestra viene chiamato, confusamente, schermo. Non esiste un comando exec screen. Non c'è neanche un concatenamento, a meno che non si costruisca il comando usando lo script di shell (come questo:) screen -S script -X screen sh -c 'command1; command2;'.

Chiamare screen -S test -X screensenza comando è inutile perché il comando predefinito è una shell e una volta che hai generato una shell, non hai un modo non interattivo (e non subdolo) per eseguire comandi all'interno di quella shell. È meglio eseguire il comando da solo, senza una shell interattiva. Un effetto collaterale è che quando il comando termina, la finestra dello schermo non ha più un figlio e si chiuderà.

Ora, puoi chiedere allo schermo di tenere aperta la finestra comunque, dopo che il comando è stato chiuso. Utilizzare il zombiecomando schermo per abilitarlo. La sequenza è simile a:

screen -d -m -S script
screen -S script -X zombie qr
screen -S script -X screen tail -f /var/log/messages
screen -S script -X screen tail -f /var/log/xinetd.log

Per ricollegare in modo interattivo:

screen -S script -r

E infine, puoi riscrivere questi comandi -X come script screenrc.

screenrc:

zombie qr
screen tail -f /var/log/messages
screen tail -f /var/log/xinetd.log

script:

screen -d -m -S script -c screenrc

Sì, lo so che -X sta prendendo un comando sullo schermo, che cosa intendo quando ho detto "Concatenamento dello schermo concatenato (quello dopo -X)" (Ok, non è affatto chiaro) ma c'è un comando per lo schermo, guarda l'uomo pagina, ma come hai detto non c'è modo di farlo funzionare come desiderato in modalità non interattiva. Ad ogni modo con la soluzione AlexD e il tuo comando zombie aggiungo ho quello che voglio! Grazie
raggio

@Tobu: +200 per menzionare gli zombi! Alla fine non l'avrei mai notato in quel terribile manuale!
viti

6

Se vuoi lo stesso effetto di Ctrl-A callora dovresti usare screeninvece di exec:

schermo -S test -X schermo coda -f / var / log / messaggi
schermo -S test -X schermo
schermo -S test -X coda schermo -f /var/log/xinetd.log

Inoltre, è possibile spostare i comandi in alto nel $HOME/.screenrc-younameitfile (senza screen -S test -Xprefisso) e avviarlo screen -c $HOME/.screenrc-younameitquando si desidera creare una sessione schermo specifica.


Il Ctrl-A c è nella mia terza riga, suppongo che exec non funzioni perché exec esegue il comando nella finestra corrente che potrebbe non essere definito quando lo schermo è staccato. La schermata di concatenamento della soluzione alternativa e il comando sono corretti, avrei dovuto provarlo! Aggiungerò una risposta a me stesso perché la tua risposta non ha la creazione della sessione e ha una linea inutile (seconda, salta 1 finestra)
raggio

In effetti non funziona come previsto, le finestre si chiudono non appena il programma si arresta. se fai lo schermo -S test -X screen ls, la finestra si chiuderà e non vedrai mai il risultato
raggio

1

usare byobu è un'opzione?


Ho appena provato, non vedo come potrebbe essere d'aiuto, ma se hai una soluzione funzionante con byobu potrebbe essere ok, preferisco una soluzione solo per lo schermo ma usare un componente aggiuntivo è meglio che non avere alcuna soluzione!
raggio

1

Stasera stavo facendo la stessa cosa, volevo aprire lo schermo con diversi file pre-aperti. Mi ci è voluto un po 'per capire tutto questo, ma alla fine ho pensato a quanto segue che sembra funzionare abbastanza bene:


#1/bin/sh 
screen -d -m -S CS140 
screen -S CS140 -X screen -t thread.c 
screen -p 1 -S CS140 -X eval 'stuff "vim cs140-ps2/src/threads/thread.c\015"'
screen -S CS140 -X screen -t thread.h 
screen -p 2 -S CS140 -X eval 'stuff "vim cs140-ps2/src/threads/thread.h\015"'
screen -S CS140 -X screen -t palloc.c 
screen -p 3 -S CS140 -X eval 'stuff "vim cs140-ps2/src/threads/palloc.c\015"'
screen -S CS140 -X screen -t intr-stubs.h 
screen -p 4 -S CS140 -X eval 'stuff "vim cs140-ps2/src/threads/intr-stubs.h\015"'
screen -S CS140 -X screen -t pagedir.c 
screen -p 5 -S CS140 -X eval 'stuff "vim cs140-ps2/src/userprog/pagedir.c\015"'
screen -r -d CS140 

Ciò creerà sei schermate diverse, con le schermate 1-5 che hanno aperto vari file. Non conosco tutti i dettagli ma 'roba' essenzialmente dice allo schermo che il seguente testo tra virgolette non è un comando a schermo. L '"eval" quindi elimina tutto ciò che è racchiuso tra virgolette. Senza questo, screen -p 4 -S CS140 -X stuff "vim cs140-ps2/src/threads/intr-stubs.h\015" semplicemente il pipe cita il testo citato senza eseguirlo. Eval leggerà '\ 015' come una nuova riga e quindi eseguirà il testo precedente.

In termini di altri dettagli, screen -p 1 -S CS140 -X CMD dice alla shell di inviare il 'CMD' alla prima finestra della sessione dello schermo chiamata 'CS140'.

Spero possa aiutare!

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.