Tela Executar (GNU) do script

11

Gostaria de iniciar algum aplicativo dentro da sessão da tela, mas a partir de um script.
Sem script, eu apenas lançaria a tela, em seguida, abriria N janelas com crtl-ac e executaria 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 anexo a cauda da sessão não está sendo executada. Se eu anexar a sessão logo depois screen -d -m -S startupe executar screen -S startup -X exec tail -f /var/log/messagesem outro terminal, ela funcionará.

Perdi algo ?

Edite após a resposta AlexD:

Uma meia 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 encadeamento da tela (aquele após -X) com o comando está funcionando enquanto exec provavelmente não é porque o exec espera que uma janela atual seja definida enquanto não houver uma atual quando a tela for desanexada. Obrigado a AlexD por essas dicas.

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

raio
fonte
screen sempre termina quando o comando com o qual se foi lançado extremidades - é uma característica normal da ferramenta :) ..assim se você correr screen top, quando você sair top, screenvai sair também
Warren
Sim, agora que é por isso que tentei iniciar a tela como deamon, em seguida, use exec e use o comando screen para abrir uma nova janela (iniciando um shell). Eu também tentei tu preceder o bash entre exec e cauda ou entre a tela e dizer mas nem estão trabalhando
raio de

Respostas:

14

O screen -S test -X screen commandcomando é o que você precisa para adicionar janelas à sua sessão do daemon, mas não pelos motivos que você indica. Funciona porque -X usa um comando de tela e não um comando de shell, e o comando de tela para criar uma janela é chamado, confusamente, de tela. Não há comando de tela exec. Também não há encadeamento, a menos que você construa seu comando usando scripts de shell (assim:) screen -S script -X screen sh -c 'command1; command2;'.

Chamando screen -S test -X screencom nenhum comando é inútil porque o comando padrão é um shell, e depois de ter gerado uma concha, você não tem uma maneira não-interativo (e não desonesto) para executar comandos dentro dessa shell. É melhor executar o comando por si só, sem um shell interativo. Um efeito colateral é que, quando o comando sai, a janela da tela não tem mais filhos e fecha.

Agora, você pode solicitar que a tela mantenha a janela aberta de qualquer maneira, depois que o comando for encerrado. Use o zombiecomando 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 reconectar 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

Roteiro:

screen -d -m -S script -c screenrc
Tobu
fonte
Sim, eu sei que -X está assumindo um comando de tela, o que eu quero dizer quando disse "Chaining screen command (the one after -X)" (Ok, não está claro), mas existe um comando de exec de tela, olha o homem página, mas como você disse, não há como fazê-lo funcionar como desejado no modo não interativo. Enfim, com a solução AlexD e você adiciona o comando zumbi, consegui o que queria! Obrigado
raio
@Tobu: +200 por mencionar zumbis! Eu nunca teria notado isso naquele manual terrível!
videiras
6

Se você deseja o mesmo efeito que Ctrl-A cvocê deve usar em screenvez de exec:

tela -S teste -X tela cauda -f / var / log / messages
tela -S teste -X tela
tela -S teste -X tela tail -f /var/log/xinetd.log

Além disso, você pode mover seus comandos acima para $HOME/.screenrc-younameitarquivo (sem screen -S test -Xprefixo) e iniciar screen -c $HOME/.screenrc-younameitquando quiser criar uma sessão de tela específica.

AlexD
fonte
O Ctrl-A c está na minha terceira linha, acho que exec não está funcionando porque exec executa o comando nas janelas atuais que podem não ser definidas quando a tela é desanexada. Sua tela de encadeamento alternativa e o comando é bom, eu deveria ter tentado! Acrescentarei uma resposta a mim mesmo porque sua resposta não possui a criação da sessão e possui uma linha inútil (segunda, pulando uma janela)
raio
Na verdade, não está funcionando como o esperado, as janelas fecham assim que o programa para. se você fizer a tela -S test -X screen ls, a janela será fechada e você nunca verá o resultado
raio
1

está usando byobu uma opção?

Sirex
fonte
Acabei de experimentá-lo, não vejo como isso poderia ajudar, mas se você tiver uma solução funcional com byobu, pode estar tudo bem, prefiro uma solução apenas de tela, mas usar um complemento é melhor do que não ter solução!
raio
1

Eu estava fazendo a mesma coisa hoje à noite, queria abrir a tela com vários arquivos pré-abertos. Demorei um pouco para entender tudo isso, mas eu finalmente desenvolvi o 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.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 

Isso criará seis telas diferentes, com as telas 1 a 5 abrindo vários arquivos. Eu não sei todas as especificidades, mas 'coisas' essencialmente informa à tela o seguinte texto citado não é um comando de tela. O 'eval' elimina tudo o que está contido nas aspas. Sem isso, screen -p 4 -S CS140 -X stuff "vim cs140-ps2/src/threads/intr-stubs.h\015" simplesmente envia o texto citado sem executá-lo. O Eval lerá '\ 015' como uma nova linha e, assim, executará o texto anterior.

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

Espero que ajude!

DevonH
fonte