サーバーに ssh で接続し、継続的なバックグラウンド プロセス (無限の Python スクリプト) を開始して、サーバーを終了できる bash スクリプトを作成したいと考えています。試したことは次のとおりです。
ssh user@domain "python3 script.py &"
ssh user@domain "python3 script.py & exit"
ssh user@domain "nohup python3 script.py & exit"
どれも機能していません。スクリプトは正常に起動しますが、サーバーを終了できず、ログインしたままになります。
答え1
このnohup
コマンドは、あなたが考えていることとは異なり、ハングアップ信号を無視して、ターミナル ドライバーが接続SIGHUP
されたプロセスに送信せずに STDIO 上の (ターミナル) 接続を切断できるようにしますが、nohup
独自の STDIO 接続は閉じず、実際には開始したプロセスに渡します。そのため、sshd
プロセスが終了し、その結果としてそれらの記述子が閉じられるまで待機します。
したがって、開始するプロセスが によって指定された STDOUT および STDERR 記述子に接続されていないことを確認する必要がありますsshd
(STDIN は ですでに開かれています/dev/null
)。これは、それらをリダイレクト (ファイルまたは に/dev/null
) することで実行できます。SSH接続が切断されるとnohup
何も送信されないため、 コマンドは厳密には必要ありません。SIGHUP
これを試して:
ssh user@domain "python3 script >/dev/null 2>&1 &"
答え2
ターミナル マルチプレクサを試してみてください。tmux は素晴らしいです。私は通常、何かをインストールする必要があるかもしれないアドバイスは好きではありませんが、tmux はツール ベルトに入れておくと非常に便利なアプリです。(すでにインストールされている可能性があります)
tmux でラップされたアプリを起動し、ラップトップをデタッチして閉じ、別の場所に移動し、再度ログインして、tmux で実行中のセッションに再度接続することができます。OS が古い場合は screen でも同様の動作をしますが、私は tmux を好みます。
コマンドラインから新しいアプリを起動したり、次のようにフォーマットされたアプリを起動したりできます。
tmux 新規セッション "command1"
tmux new-session "ping 8.8.8.8"
しかし、セッションに名前を付けたほうがよいでしょう。バックグラウンドで開始する muxping という名前の新しいセッションを省略形で指定します。-d は切り離されています。
tmux new -d -s muxping "ping 8.8.8.8"
バックグラウンドで表示する
tmux ls
それに付ける
tmux a
さらに、tmux では画面を分割したり、非常に便利な操作を数多く実行したりできます。大きなマニュアル ページを簡素化した tmux チート シートを掲載したサイトは数多くあります。始めるのは非常に簡単です。