Como executar um comando na tela e desanexar?

75

Como posso obter a tela para executar um comando e depois desanexá-lo (ou seja, automaticamente em um único script sem mais informações além de iniciar o script inicialmente)? Por exemplo, eu executo o myscript.sh e ele inicia automaticamente uma sessão na tela, executa um comando e depois desanexa.

darkfeline
fonte

Respostas:

114

Essa é fácil:

screen -d -m yourcommand
Alan Curry
fonte
4
sem dados. tela -d comando -m, -list tela diz há soquetes, tela -r há sessões
darkfeline
11
De alguma forma, seu comando não foi encontrado ou não está funcionando corretamente no ambiente de tela criado automaticamente. Tente apenas fazer screen yourcommandsem a -de -me ver como isso vai primeiro.
Alan Curry
Você está certa. a tela termina quando o comando termina, ao contrário das minhas expectativas. Mas sua resposta funciona.
31812 darkfeline
3
Você pode alterar isso ativando a zombieopção na tela. Coloque zombie xyno seu ~/.screenrc. Também deve ser possível habilitá-lo para uma sessão apenas b colocando zombie xyoutro arquivo e usando-o, -c filemas por algum motivo isso não está funcionando quando o tento. Ou apenas usesh -c 'yourcommand;while :;do sleep 9999; done'
Alan Curry
@ AlanCurry, não, isso também não funciona para mim, embora o comando seja executado perfeitamente (e demore várias horas) quando executado manualmente em uma tela.
Cerin
47

Para executar um único comando na tela e desanexar, você pode tentar:

screen -dm sleep 10

Para executar vários comandos, tente:

screen -dm bash -c "sleep 10; myscript.sh"

Observe que quando um programa termina, a tela (por padrão) mata a janela que o continha.

Se você não deseja que sua sessão seja interrompida após a conclusão do script, adicione exec shno final, por exemplo:

screen -dm bash -c 'sleep 5; exec sh'

Para listar todas as suas sessões, tente:

screen -list

Relacionado: Iniciar tela Unix, comando Executar, desanexar .

kenorb
fonte
2
Isso funcionou para mim no Ubuntu 16.04. Além de citar a sua sessão para que você possa voltar a ela mais tarde, adicione -S sessionname: screen -dmS MyLongRunningScript bash -c "...".
Dan Dascalescu
16

Para iniciar uma nova sessão em segundo plano com o nome 'sonolento'

screen -S sleepy -dm sleep 60

Para matar a sessão 'sonolenta'

screen -S sleepy -X quit      
Michal Zmuda
fonte
por que isso não funciona screen -S sleepy -dm "cd myfolder;sleep 60"?
Toolkit
@ Toolkit O problema é que você tem o comando entre aspas e foi tratado como um comando grande. Obviamente, não podemos tirá-lo de aspas por causa do ponto e vírgula. Para resolver isso, execute o comando da seguinte maneira: screen -S sleepy -dm bash -c "cd myfolder; sleep 60"
Jason Thompson
3
screen -dmS screen_session_name bash -c 'echo "doing stuff"; exec bash'
tkjef
fonte
0

aconteceu comigo quando eu pressionei o controle c (sig int) para sair do meu programa. sai de todo bash. então eu achei isso para pegar SIGINT. e impedir a saída da última festança. (precisa digitar exit para sair)

screen -dmS "screenNameHere" bash -c "trap 'echo gotsigint' INT; cd /mydir ; my_command_here;  bash"


example:

screen -dmS "status_updates" bash -c "trap 'echo gotsigint' INT; cd /opt/status_update ; forever index.js ;  bash"

Acho útil usar o cron para executar programas nodejs na inicialização. e para executar a tela no momento da inicialização. no cron existem eventos especiais sintaxe @reboot

to edit cron, execute:
crontab -e

then type
@reboot screen -dmS "screenNameHere" bash -c "trap 'echo gotsigint' INT; cd /mydir ; my_command_here;  bash"
Shimon Doodkin
fonte