화면에서 명령을 실행하려고 하는데 화면에서 Ctrl-C를 사용하여 하위 프로세스를 종료하면 다음과 같이 세션이 종료되지 않습니다. https://unix.stackexchange.com/a/47279/79125, 그러나 제 경우에는 명령이 다른 사용자로 실행 중이고 하위 프로세스에서 Ctrl-C를 누를 때 셸로 돌아가고 싶습니다. 이건 나의 실패한 시도야
$ 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'"
답변1
신호 처리
문제는 쉘과 애플리케이션이 모두 신호를 수신한다는 것입니다. 쉘은 자식 프로세스도 신호를 무시하기 때문에 단순히 신호를 무시할 수는 없습니다.
해결책은 신호 처리기를 사용하여 신호를 애플리케이션에 전달하는 것입니다.
bash -cm 'trap "kill -INT \$KILLPID" int; /bin/sleep 5 & KILLPID=$!; fg; /bin/echo foo'
-m
비대화형 셸에 대한 작업 제어는 기본적으로 비활성화되어 있으므로 이는 필요합니다.
전체 명령(테스트되지 않음):
screen [...] su - appuser -c bash -c 'cd /appdir/bin; ./app start & KILLPID=$!; trap "kill -INT $KILLPID" int; fg; bash'
답변2
먼저 탭을 생성한 다음 Tell Screen을 사용하여 그 안에서 무언가를 실행해야 합니다 -X stuff
.
예를 들어:
#!/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'
screen -S mySession -d -RR
예를 들어 다음을 사용하여 이 화면에 연결할 수 있습니다 . 탭 top
이나 htop
해당 탭 내에서 종료하면 해당 탭은 닫히지 않고 다시 돌아옵니다.애플리케이션 사용자의쉘 프롬프트.
-c /dev/null
나는 이것을 화면이 내 것을 읽지 못하도록 하기 위해 이것을 사용하고 있습니다 ~/.screenrc
. 그러면 여러 개의 탭이 생성되고 내가 원하는 방식으로 모든 것이 설정됩니다. 아니면 원했던 적이 있었는데, tmux
수십 년 동안 사용한 후 약 1년 전에 전환했습니다 screen
.
또 다른 방법은 필요한 명령 screen
과 stuff
명령을 사용하여 새 screenrc 파일을 만든 다음 실행하는 것 입니다.screen -c /path/to/newscreenrc