Crea schermo ed esegui il comando senza collegarlo


29

Sto lavorando per automatizzare una routine di manutenzione che prevede l'avvio e l'arresto di uno script in esecuzione in una sessione dello schermo. Il mio approccio è quello di uccidere la sessione dello schermo, quindi riavviarlo ed eseguire il comando dall'interno di uno script usando le abilità sia per creare uno schermo che passare un comando senza bisogno di collegarlo allo schermo.

Tuttavia, ho delle difficoltà con questo. Posso creare lo schermo correttamente senza collegarlo usando screen -d -m -S screen_name. Tuttavia, se eseguo un comando basato su:

screen -S screen_name-X stuff "command 1"'echo -ne '\015''"command 2"'echo -ne '\015''

con l'eco -ne '\ 015' che viene racchiuso da backtick anziché da virgolette singole. Serve a simulare l'utente premendo il tasto Invio mentre i comandi che utilizzo si spostano in una directory ed eseguono uno script situato lì. Questo comando funziona, ma solo se lo schermo è stato collegato una volta creato. Mentre sto cercando di automatizzare il processo di creazione dello schermo ed esecuzione dei comandi al suo interno, vorrei evitare di dover allegare e staccare uno script. Proverò il suggerimento di creare uno script di shell contenente i comandi che devo eseguire all'interno dello schermo e modificarli in base ai miei risultati.

C'è un modo per creare uno schermo ed eseguire un comando all'interno dello schermo in un solo comando o senza doverlo collegare allo schermo dopo averlo creato ma prima dell'esecuzione del comando?

Grazie in anticipo.

** Aggiornamento - dopo aver provato il suggerimento di posizionare i comandi che devo eseguire all'interno di uno script della shell sono stato in grado di creare con successo uno schermo ed eseguire i comandi all'interno dello schermo, ma sto ottenendo il comportamento che quando lo script smette di funzionare anche lo schermo si chiude. Questo non dovrebbe essere un problema poiché lo script è uno script di registrazione che dovrebbe fermarsi solo con la conoscenza dell'amministratore di sistema o tramite lo script che sto cercando di sviluppare, tuttavia sarebbe preferibile avere la configurazione dello schermo in modo tale che lo schermo non scompare se lo script viene interrotto. È possibile raggiungere questo comportamento? **


1
Ho riscontrato questo stesso problema e ho trovato una soluzione su superuser.com per chiunque si imbatte in questo problema superuser.com/questions/342463/…
Dan Herbert

Per tenere aperto lo schermo puoi usare qualcosa come: screen bash -c 'echo "test"; / bin / bash '
gwyn,

1
Per il problema di chiusura automatica, è possibile utilizzare uno speciale .screenrcche contiene la riga zombie kr, che manterrà aperta una finestra finita e che è possibile premere kper chiudere il winodw o reseguire nuovamente il comando nella finestra. Ho questo per il mio .screenrc predefinito.
Martin C.,

Risposte:


18

Penso che potresti incorrere in diversi problemi.

Se il comando termina prima di ricollegarti, lo schermo scompare. Puoi dimostrarlo usando:

screen -d -m ls -l

Eseguirà il ls -lcomando, ma screen -listnon lo mostrerà al termine del processo dello schermo.

Inoltre non ho idea di cosa stai cercando di fare con questa roba \ 015. Forse l'aggiornamento della tua domanda sarebbe di aiuto, poiché quello che penso che stai cercando di fare è eseguire più comandi in una sessione di schermo. Questo dovrebbe essere semplice come:

screen -d -m bash -c "command1 ; command2 ; command3"

Se questi sono usati molto, forse dovresti creare uno script di shell che esegue solo questi comandi, quindi utilizzare uno più semplice:

screen -d -m /path/to/script.sh

c'è un modo per ottenere un comportamento simile senza che lo schermo si stacchi immediatamente? Di 'che voglio iniziare una sessione ssh e poi staccare subito dopo; screen -d -m sshsi staccherà al prompt della password prima che venga effettuata la sessione.
stella luminosa il

Questo non funziona per me. Sostituendo hte "commandN" con diversi programmi di lunga durata non viene visualizzato nulla in screen -list. Inoltre, questo non nomina lo schermo come sta tentando di fare l'OP.
Cerin,

Stavo cercando di eseguire un programma Python usando questo metodo. Ho provato a creare uno script sh per eseguirlo, ma non ho visto lo schermo nell'elenco. Invece ho usato screen -d -m python EventGenerator.py, che ha funzionato alla grande
Dan Ciborowski - MSFT il

1
Probabilmente dovrebbe essere bash -c "commands"invece dibash "commands"
marcovtwout

Hai ragione, ci deve essere -c.
Xdg,

9

Avvia una schermata staccata

screen -dmS <screen name>

Eseguire il comando nella schermata staccata precedentemente creata

screen -S <screen name> -X stuff '<CMD>\n'

Sì, è necessario digitare il simbolo di invio per inviare il comando, altrimenti si aggiungerà semplicemente la stringa allo schermo.

http://osdir.com/ml/gnu.screen/2003-09/msg00029.html


1
che cos'è "roba"?
Nadav B,

stuffè in realtà un comando che copia e incolla un altro comando in una sessione dello schermo: stuff [stringa] Riempie la stringa di stringa nel buffer di input della finestra corrente. Questo è come il comando "incolla" ma con molto meno sovraccarico. Senza un parametro, lo schermo richiederà una stringa. Non è possibile incollare buffer di grandi dimensioni con il comando "stuff". È molto utile per le combinazioni di tasti. Vedi anche "bindkey". [citato da theterminallife.com/sending-commands-into-a-screen-session/]
alisa

2

Ho riscontrato questo problema prima, era un bug con l'implementazione di Cygwin.

Quello che ho fatto è stato creare un ".screenrc_detaching" con solo il seguente comando

#detach
detach 

e quindi avviare la schermata con

screen -c ~/loginScripts/tempScreenrc/.screenrc_detaching

Quindi hai la tua sessione schermo ed è già stata collegata e scollegata e sei bravo a inoltrare i comandi ad essa.

Facile! : P


2

Questo ha fatto il lavoro per me, senza -cfunzionare

screen -d -m bash -c "command1; command2; command3"


1

Un modo copia e incolla per testare le risposte precedenti è:

 # No sessions:
screen -ls

 # Returns immediately:
time screen -dmS screen_descritive_session_name  bash -c 'sleep 20; hostname >> /tmp/h'

 # New session present:
screen -ls

 # File with return of command was created :)
sleep 20; cat /tmp/h

Il risultato atteso dovrebbe essere simile a:

No Sockets found in /var/run/screen/S-yourusernamehere.

(Ciò significa che non è stata precedentemente creata alcuna sessione schermo)

real    0m0.002s
user    0m0.000s
sys     0m0.000s

(È il tempo impiegato per creare lo schermo e staccarsene. Quasi istantaneo.)

There is a screen on:
    20318.screen_descritive_session_name    (20/08/2018 16:29:35)   (Detached)
1 Socket in /var/run/screen/S-yourusernamehere.

(Questo output mostra le sessioni dello schermo disponibili. Creato sull'ultimo comando.)

sleep 20; cat /tmp/h

(Questo catmostra il nome host eseguito all'interno di gnu-screen)


e qual è il risultato di tali test?
Pierre.Vriens,

Hai ragione, non c'è stato nessun esempio. Aggiungerò.
Enrique S. Filiage,

molto meglio! merci! +1
Pierre.Vriens

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.