Execute um programa com a tela GNU e desanexe imediatamente após

27

Estou tentando descobrir como escrever um script que inicie o (s) programa (s) nas sessões da tela GNU na inicialização do sistema. Eu estou tentando isso:

#!/bin/bash
screen -S test -d -m -X $HOME/folder/folder/.program \
screen -S test2 -d -m -X $HOME/folder/folder/.program2 \

mas o comando não pode ser executado porque a sessão já está desanexada? A única coisa que eu preciso é executar o comando na sessão de tela e desanexar esta sessão imediatamente.

Obrigado pelas respostas, mas agora enfrentei outro problema. O script para de funcionar depois que eu coloco algumas variáveis ​​para o meu "programa e programa2". Algo assim:

#!/bin/bash
screen -S test -d -m $HOME/folder/folder/.program -f config.cfg

por algum motivo "-f config.cfg" foi ignorado. Também estou tentando citar o comando e não ajuda também.

TbMa
fonte
Por que a -Xopção?
enzotib 22/09/11

Respostas:

34

Você realmente quis colocar \o final da linha? Caso contrário, tente removê-los - eles escapam do seguinte caractere.

soltar também -Xajuda a instalação a trabalhar para mim, por exemplo:

screen -S test -d -m -X touch /tmp/test

falha com No screen session found, no entanto:

screen -S test -d -m touch /tmp/test

funciona bem. Como tal, suspeito que o seguinte funcione para você:

#!/bin/bash
screen -S test -d -m $HOME/folder/folder/.program
screen -S test2 -d -m $HOME/folder/folder/.program2

Lembre-se de que, se você executar isso no momento da inicialização, $ HOME não será o mesmo que após o login como um usuário específico. Se você precisar executá-lo como um determinado usuário, precisará usá su-lo para executá-lo como esse usuário, e especificar o caminho completo removerá qualquer ambiguidade:

#!/bin/bash
screen -S test -d -m su - username /home/username/folder/folder/.program
screen -S test2 -d -m su - username /home/username/folder/folder/.program2

Ou, você chamaria o script inteiro acima como su - username /path/to/your/script.

Cry Havok
fonte
Obrigado pelas respostas, mas agora enfrentei outro problema. Script pára de funcionar depois de eu colocar algumas variáveis para o meu "programa e program2"
TBMA
Isso: screen -S test -d -m $HOME/folder/folder/.programquase faz exatamente o que estou procurando, exceto se a pasta / .program estiver concluída, a sessão na tela será fechada automaticamente. Existe alguma maneira de manter a sessão da tela (shell) em execução mesmo após a conclusão do programa? Talvez, em vez de executar o programa exclusivamente, inicie um shell que inicie o programa e retorne ao prompt do shell, ou algo assim?
RocketNuts
4

Como Cry Havok mencionado, você pode colocar o programa diretamente na linha de comando.

Se você realmente deve usar a opção -X, então a) precisa especificar o comando 'screen' eb) a sessão precisa existir previamente.

screen -dmS test
screen -S test -X screen $HOME/folder/folder/.program
screen -dmS test2
screen -S test2 -X screen $HOME/folder/folder/.program2
Arcege
fonte
Se você colocar o programa na linha de comando, a tela será encerrada quando o programa for encerrado; Não vejo um sinalizador de linha de comando para manter a tela aberta, se você quiser ver a saída do console. Se você iniciar a tela e enviar os comandos separadamente, como mostrado aqui, poderá ser necessário sleepcomandos explícitos para dar tempo à tela para iniciar a sessão antes de enviar o comando.
Chinasaur
Esta resposta é muito semelhante à resposta stackoverflow.com, que responde a uma pergunta semelhante . Eu prefiro esta resposta do que @CryHavok porque esta resposta executa seu programa dentro do shell padrão do usuário (@CryHavok executa o programa sem um shell pai, portanto, quando o programa morre ou você pressiona a tecla Ctrl-c, a sessão na tela é encerrada imediatamente)
Trevor Boyd Smith