ユーザーがコマンドを終了したときに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'

おすすめ記事