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