Evitar que a tela do GNU encerre a sessão quando o comando é eliminado pelo usuário

0
Estou tentando executar um comando na tela, mas impedi-lo de terminar a sessão, uma vez que eu mato o processo filho com Ctrl-C enquanto na tela, muito parecido com isto: link , mas no meu caso o comando é executado como usuário diferente, e eu gostaria de voltar um shell quando eu Ctrl-C o processo filho. Aqui estão minhas tentativas malsucedidas

$ screen -S mySession -X screen -t tab3   sh  -c ' su - appuser -c "cd /appdir/bin; ./app start; bash"'

$ screen -S mySession -X screen -t tab6   su - appuser -c "sh -c 'cd /appdir/bin; ./app start; exec bash'"

$ screen -S mySession -X screen -t tab6   sh -c "su - appuser -c 'cd /appdir/bin; ./app start; exec bash'" 

$ screen -S mySession -X screen -t tab6   sh -c "su - appuser -c 'cd /appdir/bin; ./app start; exec bash'; su - someuser -c 'exec bash'"
    
por mike-m 05.08.2017 / 20:29

2 respostas

1

tratamento de sinal

O problema é que tanto o shell externo quanto o aplicativo recebem o sinal. A casca externa não pode simplesmente ignorar o sinal porque assim seria seu filho processa.

A solução está usando um manipulador de sinal que transmite o sinal para o aplicativo:

bash -cm 'trap "kill -INT \$KILLPID" int; /bin/sleep 5 & KILLPID=$!; fg; /bin/echo foo'

O -m é necessário porque o controle de trabalho é desativado por padrão para shells não interativos.

O comando completo (não testado):

screen [...]  su - appuser -c bash -c 'cd /appdir/bin; ./app start & KILLPID=$!; trap "kill -INT $KILLPID" int; fg; bash'
    
por 05.08.2017 / 23:22
2

Você precisa criar as guias primeiro e, em seguida, dizer à tela para executar algo nelas, usando -X stuff .

Por exemplo:

#!/bin/bash

# start a new detached screen, create windows named tab3 and tab6
# with appuser's $SHELL running in them, running as user "appuser".
screen -c /dev/null -d -m -S mySession
screen -c /dev/null -S mySession -X screen -t tab3 sudo -u appuser -i
screen -c /dev/null -S mySession -X screen -t tab6 sudo -u appuser -i

# as root, you could use 'su - appuser', instead of sudo but that
# would ask for a password if this is run as non-root user.  sudo
# can be configured to not ask for a password if required.   

# run some programs in the already-created tab3 and tab6
# using screen's "stuff" command.
screen -c /dev/null -S mySession -p tab3 -X stuff $'top\n'
screen -c /dev/null -S mySession -p tab6 -X stuff $'htop\n'

Você pode anexar a essa tela com, por exemplo, screen -S mySession -d -RR . Se você sair de top ou htop em suas respectivas guias, essas guias não serão fechadas, elas retornarão ao prompt do appuser .

Estou usando -c /dev/null aqui para impedir que a tela leia meu ~/.screenrc , o que cria várias guias e configura tudo como eu quero. Ou costumava querer, eu mudei para tmux cerca de um ano atrás depois de usar screen por décadas.

Outra maneira de fazer isso é criar um novo arquivo screenrc com os comandos screen e stuff necessários e, em seguida, executar apenas screen -c /path/to/newscreenrc

    
por 06.08.2017 / 04:13