Executar script em uma tela

25

Quero executar um script bash em uma tela desanexada. O script chama um programa algumas vezes, cada uma das quais leva muito tempo para esperar. Meu primeiro pensamento foi simplesmente abrir uma tela e depois chamar o script, mas parece que não consigo desconectar (por ctrl-a d) enquanto o script está em execução. Então, fiz uma pesquisa e encontrei esta instrução para substituir o shebang pelo seguinte:

#!/usr/bin/screen -d -m -S screenName /bin/bash

Mas isso também não funciona (as opções não são reconhecidas). Alguma sugestão?

PS: Ocorre-me agora que screen -dmS name ./script.shprovavelmente funcionaria para meus propósitos, mas ainda estou curioso sobre como incorporar isso ao script. Obrigado.

bongbang
fonte

Respostas:

28

A linha shebang que você viu pode funcionar em algumas variantes do unix, mas não no Linux. As linhas shebang do Linux são limitadas: você só pode ter uma opção. A cadeia inteira -d -m -S screenName /bin/bashé passada como uma única opção para screen, em vez de ser passada como palavras diferentes.

Se você deseja executar um script dentro da tela e não mexer com vários arquivos ou aspas, você pode transformar o script em um shell script que invoca a tela se ainda não estiver dentro da tela.

#!/bin/sh
if [ -z "$STY" ]; then exec screen -dm -S screenName /bin/bash "$0"; fi
do_stuff
more_stuff
Gilles 'SO- parar de ser mau'
fonte
Funciona bem, para que serve "$0"aqui?
Fabich
4
@ Lordofdark Esse é o nome do script. O script chama o screenque chama o /bin/bashque chama o script novamente.
Gilles 'SO- stop be evil'
16

De acordo com as páginas de manual da tela:

  • screen -d -m Tela inicial no modo desanexado. Isso cria uma nova sessão, mas não é anexada a ela. Isso é útil para scripts de inicialização do sistema.
  • -S sessionname Defina o nome da nova sessão como sessionname.

Então, quando eu executei o comando que você forneceu: screen -dmS name ./script.sh

Tela inicia uma janela chamada nome e executa automaticamente esse script.sh. Para voltar lá para ver o status, basta digitar:screen -r test

Agora com o Ubuntu 14.04, os comandos são um pouco diferentes. Experimentar:

screen -d -m -S test

Agora, para executar o script, você precisará ir ao arquivo de configuração para fazê-lo:

sudo vim /etc/screenrc

Uma vez lá, role para baixo e você verá:

# Example of automatically running some programs in windows on screen startup.
#
#   The following will open top in the first window, an ssh session to monkey
#   in the next window, and then open mutt and tail in windows 8 and 9
#   respectively.
#
# screen top
# screen -t monkey ssh monkey
# screen -t mail 8 mutt
# screen -t daemon 9 tail -f /var/log/daemon.log

Esta é a seção em que você precisará adicionar o nome do script para executar e que deve permitir que você faça tudo o que precisa na tela.

ryekayo
fonte
De alguma forma, esse comando ( screen -dmS ...) não funciona para mim, mesmo que realmente deva. Eu corro e então screen -lse nenhum soquete é encontrado. Pensamentos?
bongbang
Que distro você está usando?
Rickkayo #
NOME = "Ubuntu" VERSÃO = "14.04.1 LTS, Trusty Tahr" Eu acho. É uma máquina virtual.
bongbang
Me dê um pouco porque eu estou apenas deixando o trabalho e mal tentar usar a tela na minha máquina, que também é o Ubuntu 14.04
ryekayo
@bongbang - que versão da tela você tem?
slm
3

Isso é um pouco antigo, mas um dos poucos tópicos que eu pude encontrar para fazer isso. Depois de brincar, a única maneira de fazer isso funcionar no modo desanexado com o ubuntu 14. é

screen -d -m -t nameofwindow sh nameoflaunch.sh

O lançamento seria a segunda parte acima, que abriga os comandos java atuais e a versão do servidor. Eu corro baunilha.

ProjectEd
fonte