ユーザーがコマンドを終了したときにGNU画面がセッションを終了するのを防ぐ

ユーザーがコマンドを終了したときにGNU画面がセッションを終了するのを防ぐ

画面でコマンドを実行しようとしていますが、画面で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

別の方法は、必要なコマンドscreenstuffコマンドを使用して新しいscreenrcファイルを作成して実行することです。screen -c /path/to/newscreenrc

関連情報