Come posso avviare automaticamente una nuova finestra nella stessa sessione dello schermo?


4

Ho letto Come posso avviare automaticamente più sessioni dello schermo? , ma non capisco la prima risposta accettata:

screen -dmS "$SESSION_NAME" "$COMMAND" "$ARGUMENTS"

Nel mio caso, devo creare automaticamente una sessione dello schermo per uno script e successivamente devo creare una nuova finestra nella stessa sessione per un altro script. Manualmente, vorrei:

  1. esegui schermo
  2. inserisci il comando
  3. CTRL+A
  4. CTRL+C
  5. inserisci il comando
  6. CTRL+A
  7. CTRL+D

Come posso farlo automaticamente in uno script? Un semplice esempio mi aiuterebbe molto.

Grazie per le risposte


Non capisco cosa intendi per finestra nella stessa sessione dello schermo. Vuoi avere due finestre aperte che visualizzano l'output dello stesso processo? Per cosa stai usando questo?
wingedsubmariner,

Risposte:


0

Non sono esattamente sicuro di ciò che vuoi che accada: vuoi uno script che crei la sessione dello schermo con due finestre per due comandi o vuoi eseguire uno script in una finestra dello schermo che esegue un comando, quindi crea un nuovo finestra per la seconda?

Il secondo è facile, quindi cominciamo con quello:

#!/bin/bash
command1
screen command2

L'esecuzione di "schermo" all'interno dello schermo creerà una nuova finestra nella sessione corrente, non ne aprirà una nuova. Ma tornerà immediatamente, quindi dopo l'ultima riga lì, lo script uscirà mentre command2 è ancora in esecuzione. E quando command2 è terminato, la sua finestra si chiuderà.

La prima interpretazione della tua domanda è un po 'più difficile, quindi andiamo avanti e risolviamo quanto sopra mentre ci siamo:

#!/bin/bash

# Need to positively identify the session name:
SESSION=mysession.$$
echo "TO ATTACH TO SESSION: screen -r ${SESSION}"

# For signalling and stuff
FLAGDIR=$(mktemp -d)

# To keep the windows around after the commands are done,
# set the "zombie" option (see the man-page)
echo "source $HOME/.screenrc" > ${FLAGDIR}/screenrc
echo "zombie xy" >> ${FLAGDIR}/screenrc

# Use that temporary screenrc; create a detached session:
screen \
    -c ${FLAGDIR}/screenrc \
    -d -m \
    -S ${SESSION} \
    bash -c "command1 ; touch ${FLAGDIR}/done"

# Wait for command1 to terminate
while [[ ! -f ${FLAGDIR}/done ]] ; do sleep 1 ; done

# Now start command2 in a new window, by sending a remote command:
screen -S $SESSION -X screen command2

# Don't need this any more:
rm -rf ${FLAGDIR}

Lo script verrà avviato command1, attendi il completamento, quindi avvia command2e termina. Come se dovessi correre command1 ; command2 &, ma con l'output altrove. Sono sicuro che puoi capire come eseguire command1in background.


Grazie, ho bisogno di eseguire due script che verranno eseguiti in modo permanente. Sarà indipendente l'uno dall'altro ... Ed entrambi devono essere eseguiti in background ... E ho bisogno di eseguire questi script dopo l'avvio di Debian. Spero che ora sia chiaro.
Mato,

@Mato, prova a capire lo script - tutto ciò che devi fare è rimuovere il comando "touch" e il ciclo while che attende che appaia il file. Puoi cambiare "zombie xy" in "zombie xy onerror" in modo che le finestre rimangano in giro solo se i comandi terminano con un errore o un segnale, e puoi saltare l'intero materiale dello schermo se non ti interessa comandi dopo che escono o vengono uccisi.
Gabe,

e se puoi chiedere anche a te ... Come posso correggerlo con lo script inid.d? O come posso correggere terminare o riavviare con lo script init.d?
Mato,

Devi inviare il comando "esci" alla sessione dello schermo. Salvare la variabile $ SESSION da qualche parte e terminare il tutto con "screen -S $ SESSION -X quit". Guarda "man screen" per maggiori informazioni.
Gabe,

ok grazie, e probabilmente non è possibile cancellare correttamente solo una finestra - uno script nella stessa schermata tramite lo script init.d?
Mato,

2

screen -dm crea una sessione in background eseguendo il comando specificato.

Quindi se lo metti

screen -dm vi xxx
screen -dm vi yyy

nella tua sceneggiatura avrai 2 sessioni, una di editing xxx e di editing yyy.

screen -ls elencherà le sessioni alle quali è possibile allegare l'utilizzo screen -r <session number>

Questo non è molto conveniente in quanto è necessario trovare il numero di sessione. Ecco dove -Sentra.

screen -dmS session1 vi xxx

creerà una sessione distaccata chiamata session1, quindi se cambi lo script in

screen -dmS session1 vi xxx
screen -dmS session2 vi yyy

puoi scegliere la sessione a cui vuoi collegarti con screen -r session1oscreen -r session2


1
  1. Avviare la sessione startuped eseguirlo in una finestra separatacommand1
  2. Aggiungi nuova finestra staccata ed esegui command2

    screen -dmS startup bash -c 'command1; exec bash'
    screen -S startup -x -X screen bash -c 'command2; exec bash'

Ricollegare la sessione startupin qualsiasi momento

screen -r startup
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.