非対話型SSH呼び出し(疑似端末なし)を使用してプログラムを開始し、次の方法でセッションを終了するとしますCTRLC。
$ ssh user@server -- sleep 123
^C
これにより、SSHセッションが終了した後もプログラム(sleep 123
この例のプログラムなど)は引き続き実行されます。server
$ ssh user@server -- ps -ef | grep "sleep 123"
user 12430 1 0 19:28 ? 00:00:00 sleep 123
localの代わりにSIGINTをリモートで送信するssh
オプションがあることを知っています。しかし、私は疑似端末に頼らず、呼び出し時に追加のオプションを指定せずにリモートプログラムを停止する方法を探しています。-t
sleep
ssh
ssh
答え1
状況によっては、部分的な解決策を思いついた。
アイデアは次のとおりです。ssh
クライアントで終了すると、コマンドで実行されるすべてのプログラムはserver
親プロセスを失い、init
親プロセスが割り当てられます。
したがって、実行中のプログラムを編集して親PIDを継続的に確認できた場合、PIDを1に切り替えるとクライアントのプロセスを終了する必要があることがserver
わかります。ssh
cat <<-"EOF" | ssh user@server sh
while :; do
sleep 1
ppid="$(ps -p "$$" -o ppid= | tr -d "[:blank:]")"
[ "$ppid" = 1 ] && break
done
EOF