Shell script: execute a tela, abra várias telas e execute um comando em cada uma

Shell script: execute a tela, abra várias telas e execute um comando em cada uma

Exatamente o que o título diz:

Meu script de shell deveria

  • Execute o comando A, espere até terminar
  • execute "tela"
  • execute o comando B1 na tela inicial
  • abra uma nova janela (geralmente via Cmd-ac)
  • execute o comando B2 em uma nova janela
  • abrir nova janela
  • execute o comando B3 em uma nova janela

É isso, não há necessidade de esperar até que alguns (ou todos) sejam feitos, embora isso daria pontos extras. Como eu poderia fazer isso?

Responder1

Inicie um plano de fundo screencom o nome da sessão "mysession":

screen -d -m -S mysession

Execute topna primeira janela

screen -S mysession -X exec top

Inicie outra janela, nomeie-a como "win1" e execute " vmstat 10" nela

screen -S mysession -X screen -t win1
screen -S mysession -p win1 -X exec vmstat 10

Abra outra janela, nomeie-a como "win2" e execute " iostat 30" nela

screen -S mysession -X screen -t win2 
screen -S mysession -p win2 -X exec iostat 30

Para se conectar e ver a sessão:

screen -x -S mysession

Se algum dos programas sair, a janela não fechará, pois screenterá iniciado um shell em cada um (que você pode usar se necessário).

- OU -se você deseja apenas um único comando por janela ou deseja limpar mais facilmente após a conclusão dos processos, não execute o shell padrão em cada janela, apenas o(s) comando(s):

screen -d -m -S mysession top
screen -S mysession -p 0 -X title win0    # optional!
screen -S mysession -X screen -t win1 vmstat 10
screen -S mysession -X screen -t win2 iostat 30

screenirá "encerrar" a janela (possivelmente deixando o conteúdo da janela intacto, veja zombieabaixo) quando o processo terminar, ou para desligá-los:

screen -S mysession -X quit   # nuke whole the session

ou

screen -S mysession -p win2 -X kill
screen -S mysession -p win1 -X kill
screen -S mysession -p 0 -X kill

(isso pode ou não matar qualquer processo em execução, screenmas enviará um SIGHUP para cada um)

Se você deseja screenfechar automaticamente as janelas e sair quando todos os processos forem concluídos, adicione isto depois de criar a sessão (embora se você não tiver zombiedefinido no seu .screenrc, este é provavelmente o padrão de qualquer maneira):

screen -S mysession -X zombie

Isso desativa as teclas "zumbi" para fechar e ressuscitar, as janelas desaparecem quando o comando em cada janela termina e screenfecha quando a última janela termina. (Talvez seja necessário usar defzombieem vez de zombie, mas apenas o último funciona para mim, apesar da documentação em contrário.)

informação relacionada