Tela Executar (GNU) do script

10

Eu gostaria de lançar algum aplicativo dentro da sessão de tela, mas de um script.
Sem script, eu apenas iniciava a tela, depois abria o N windows com o comando crtl-a-c e executava programas em cada janela.

Eu tentei o seguinte

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

Mas quando eu anexar a cauda da sessão não está funcionando. Se eu anexar a sessão logo após screen -d -m -S startup e executar screen -S startup -X exec tail -f /var/log/messages de outro terminal, ele funciona.

Eu senti falta de algo?

Editar após a resposta de AlexD:

Uma meio solução de trabalho é

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

O comando de tela de encadeamento (aquele após -X) com o comando está funcionando enquanto exec não é provavelmente porque exec espera que uma janela atual seja definida enquanto não houver nenhuma corrente quando a tela estiver desanexada. Agradecemos a AlexD por essas dicas.

Mas há um efeito colateral estranho: quando o programa pára (se você anexar a sessão de tela e crtl-c a cauda, ou matar cauda) a janela da tela será fechada.
Portanto, o comportamento não é o mesmo que o Crtl-A ce executar o comando
Outro efeito colateral é que você não pode encadear 2 comandos

    
por radius 29.06.2010 / 11:27

4 respostas

12

O comando screen -S test -X screen command é o que você precisa para adicionar janelas à sua sessão daemon, mas não pelas razões que você dá. Isso funciona porque -X recebe um comando screen e não um comando shell, e o comando screen para criar uma janela é chamado, confusamente, de screen. Não há comando de tela exec. Não há encadeamento, a menos que você construa seu comando usando scripts de shell (como este: screen -S script -X screen sh -c 'command1; command2;' ).

Chamar screen -S test -X screen sem comando é inútil porque o comando padrão é um shell e, depois de gerar um shell, você não tem uma maneira não-interativa (e não-desonesta) de executar comandos dentro desse shell. É melhor executar o comando sozinho, sem um shell interativo. Um efeito colateral é que quando o comando sai, a janela de tela não tem mais um filho e será fechada.

Agora, você pode pedir que a tela mantenha a janela aberta de qualquer maneira, depois que o comando for encerrado. Use o comando zombie screen para ativar isso. Sua sequência se parece com:

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

Para reativar interativamente:

screen -S script -r

E, finalmente, você pode reescrever esses comandos -X como um 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
    
por 02.07.2010 / 01:01
6

Se você quiser o mesmo efeito de Ctrl-A c , use screen em vez de exec :

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

Além disso, você pode mover os comandos acima para $HOME/.screenrc-younameit file (sem screen -S test -X prefix) e iniciar screen -c $HOME/.screenrc-younameit quando quiser criar uma sessão de tela específica.

    
por 29.06.2010 / 12:24
1

está usando byobu uma opção?

    
por 01.07.2010 / 14:35
1

  Eu estava fazendo a mesma coisa esta noite, eu queria abrir a tela com vários arquivos pré-abertos. isto   levou-me um tempo para descobrir tudo isso, mas eu finalmente chegar a seguinte que   parece funcionar muito bem:


#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.c5"'
screen -S CS140 -X screen -t thread.h 
screen -p 2 -S CS140 -X eval 'stuff "vim cs140-ps2/src/threads/thread.h5"'
screen -S CS140 -X screen -t palloc.c 
screen -p 3 -S CS140 -X eval 'stuff "vim cs140-ps2/src/threads/palloc.c5"'
screen -S CS140 -X screen -t intr-stubs.h 
screen -p 4 -S CS140 -X eval 'stuff "vim cs140-ps2/src/threads/intr-stubs.h5"'
screen -S CS140 -X screen -t pagedir.c 
screen -p 5 -S CS140 -X eval 'stuff "vim cs140-ps2/src/userprog/pagedir.c5"'
screen -r -d CS140 

  Isso criará seis telas diferentes, com telas de 1 a 5 abrindo vários arquivos. Eu   não sei todos os detalhes, mas "coisas" essencialmente diz tela o seguinte texto citado   não é um comando de tela. O 'eval', então, evoca tudo o que está contido nas citações.   Sem isso, o screen -p 4 -S CS140 -X stuff "vim cs140-ps2/src/threads/intr-stubs.h5" simplesmente canaliza o texto citado sem executá-lo. O Eval lerá '\ 015' como uma nova linha e, portanto, executará o texto anterior.

  Em termos de outros detalhes, screen -p 1 -S CS140 -X CMD diz ao shell para   envie o 'CMD' para a primeira janela da sessão de tela chamada 'CS140'.

  Espero que ajude!

    
por 18.02.2013 / 13:56

Tags