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