標準シェルの場合(POSIX.1)

標準シェルの場合(POSIX.1)

私はこの質問に対する最高の答えを見つけました。nohup、disown、&の違い、私は具体的に以下を読んだ。

ジョブはまだ端末に接続されているため、disown 端末が破壊された場合(標準入力から読み取った場合、または標準出力に書き込むpty端末の場合に発生する可能性があります)、ジョブxtermとして生成されます。SSHxtermSSH

disown端末が閉じると、ジョブが終了するのを防ぐことができないようです。nohupはい、ただし、作業開始時にのみ可能です。

私がこれを正しく理解したと仮定すると、私が始めたことが正しく機能するようにするにはどうすればよいですか?いいえ nohup端末を閉じて接続を終了するとSSH終了しませんか?


setopt NO_HUPコマンドラインで実行しても大丈夫ですか?それでは、同じ端末で実行されているすべてのタスクに影響しませんか?

答え1

標準シェルの場合(POSIX.1)

で始まり、&デフォルト以外のものから読み取るようにしstdin(== /dev/tty== /dev/stdin== /dev/fd/0)+デフォルト以外のものを書き込むようにし、stdout(== /dev/tty== /dev/stdin== /dev/fd/1)(と同じstderr)操作を 'tまたは一時停止しません( =停止)。停止するか、端末から読み取って作業端末を停止して続行するには、ジョブのプロセスにハンドラ(トラップ)があることを確認してください。ため息をつく信号。端末に書き込む必要があり、端末の停止状態を維持するには、端末に書き込むプロセスにハンドラがあることを確認してください。信号パイプライン

説明する:

バックグラウンドプロセスが送信されます信号入力端末からデータを読み取ろうとする瞬間。基本的な構成は次のとおりです。信号入力プロセスを停止(=一時停止)することです。端末の停止により、バックグラウンドジョブの第1世代プロセスがinitに上位が変更され、ワー​​クプロセスの第1世代プロセスグループが孤児プロセスグループになります。 (孤立したプロセスグループは、他のプロセスグループにメンバーはありませんが、同じセッションに親プロセスを持つプロセスグループです。)システムは、停止した(一時停止した)すべての孤立したプロセスグループを送信します。ため息をつく続いて信号制御(彼らが確実に得られるようにため息をつく)端末が中断されると、定義によっては、そのプロセスグループ内のどのプロセスも同じセッションの親プロセスによって起動できないためです。したがって、これらのプロセスはシステムによって起きる必要がありますが、通常の動作ではなく、端末の停止によって起きたという信号をプロセスに送信します。ため息をつくこれを行うためのメカニズムであり、基本構成です。ため息をつくただ停止してください。

端末を一時停止すると、その端末への後続の書き込みも発生します。信号パイプライン、治療せずに放置すると致命的かもしれません。

長い話を短く 孤立したプロセスグループが一時停止されていない場合(次へ)信号入力それとも^ Zでも何でも恐れる必要はありません。ため息をつく信号を端末の代わりにファイルに出力し、端末の代わりにファイルからstdout読み取るstderrと恐れることはありません。信号パイプライン。生端末ではなく端末マルチプレクサで実行している場合は心配する必要はありません。ため息をつくまたは信号パイプライン


zshの場合

私は少し遊んでいて、実際にwhileが上記のように動作することがzshわかりました(上記の動作はPOSIX.1に準拠する必要があります)。bashzshため息をつく到着走るバックグラウンド操作も可能です。上記の状況でのみ送信するようにsetopt NO_HUP設定してください(またはシステム、ここでは不明)。SIGHUP

これをテストするには、次のコマンドを実行してください。

( rm -f hup; trap 'echo HUP > hup' HUP; sleep 100)

さまざまな方法で(背景、前景、停止) 接続を切断します。その後、hupファイルが作成されたことを確認できます。これは、操作が正常に実行されたことを意味します。ため息をつく

答え2

disownまたは を使用してみると便利です( 、nohupまたは は使用しませんが&)。どちらのツールも複数の端末を実行し、各端末で発生する操作を中断することなく端末から切り離すことができます。もっと便利だと思います。screentmuxtmux


使用tmux

セッション名を指定できます。

tmux new-session -s ${SESSION_NAME}

添付せずに始めて、

tmux new-session -d -s ${SESSION_NAME} '/home/user/script.sh'

セッションの一覧、

tmux list-sessions

またはそれらに命令を送ってください:

tmux send-keys -t ${SESSION_NAME} "echo Hello world"
tmux send-keys -t ${SESSION_NAME} Enter

もちろん、進行中のセッションを接続(「開く」)して、何が起こっているのかを確認できます。

tmux attach-session -t ${SESSION_NAME}

次に、閉じずにそのままにしてをCtrl + B押しますD

答え3

プログラムは次のように書くことができます。一括たとえば、次のように作業します。ここのドキュメント:

batch << EOJ
  ./yourprogram some $ARGUMENTS
EOJ

プログラムがインタラクティブで起動された場合、一般的な安全ソリューションは表示されません。〜の後使い始めるシステム(3)(たとえばsystem("$EDITOR /tmp/somefile.txt");...) 一部の X11 クライアントアプリケーションまたは一部は、次のものを使用します。ターミナル(4)

プログラムを改善できる場合は、いくつかのプログラム引数を使用してプログラムを呼び出すことを検討できます。デーモン(3)

次の一部の端末マネージャを使用することもできます。画面(1)など...

関連情報