端末に接続されていなくてもプロセスをLinuxで実行し続ける、Ctrl + Dソリューションは?


0

私は何年も使っています nohup または screen SSHで端末に接続した後もプロセスを実行し続けるために。だから私の友人の一人、LinuxまたはCSのグリーンハンドが私に言ったとき、それはかなり私を驚かせた Ctrlキーを押しながら + D (または exit )同じことをすることができ、そしておそらくもっとエレガントな方法で。

だからここにそれを行う方法があります:最初にいつものようにバックグラウンドであなたのプロセスを実行します & または使用 bgその後、端末から切断したいときは、 Ctrlキーを押しながら + D または exit ログアウトする

知っている Ctrlキーを押しながら + D または exit ログアウトするための非常に一般的な方法です。しかし、もう一度ログインすると、実行したばかりのプロセスが見つかります。信じられないかもしれませんが、私はショックを受けました。私は単純なデッドループのpythonスクリプトを含むいくつかの異なる状況でメソッドを試してみましたが、実際にはうまくいきました。

私はこれについていくつかの情報を検索しようとしましたが、みんなが話しているようです nohup または screen。私が話している方法は常識ですか?それはいくつかのシステムや環境のためだけの特定の機能ですか?それが一般的に利用可能であるならば、それからその意味は何ですか nohup

回答:


1

まず利用できるのはあなただけです nohup または screen コマンドを実行する前に、ログオフする前に続行する必要があることがわかっている場合。

押すとどうなりますか Ctrlキーを押しながら + D 入力バッファが実行中のプロセスに送信されるということです。今何が次に起こるかはあなたが現在どのアプリケーションにいるかに依存します。

ほとんどの(すべての)端末エミュレータと端末では、単にログアウトするだけでプロセスは終了します。これは、バックグラウンドでプロセスが実行されていたのであれば、そうではありませんでした。 nohup またはで screen セッション、それ だろう あなたのログアウトと共に死にます。

ただし、アプリケーション内にいることがあります。 Ctrlキーを押しながら + D 実際にそれを終わらせるのではなく、それを何らかのバックグラウンド状態にします。

他の考えはあなたの友人がについて考えていたということです Ctrlキーを押しながら + z - これは実行中のプロセスを一時停止します、そしてそれを使用して実行中のターミナルセッションから '切断'できます bg そして disown。これが終わったら、端末を閉じることができます。これは基本的にと同じです。 nohup プロセスを実行する前に

しかし、一旦それが嫌われると、あなたはこのようなプロセスに「再アタッチ」することはできません。


1

Ctrl + D ASCIIテーブルのEOTにマップします。多くの場合(ほとんどの場合)、これはEOFにマップされます。これは、データがもうないことを意味します。

端末用(例えば bash としてttyで実行 stdin )、呼び出し read() ユーザー入力がない場合、通常はブロックされるか、ゼロを返します(読み取るデータがない)。ときにtty」 消えます "、 bash 最後にEOFを読んで、これまでのところ、これ以上の入力はありません。次のように入力してEOFを手動で提示できます。 Ctrl + D

それは物事が好きであることに注目する価値があります bash その用途 readline 現在の行が空でない限り、EOFを表示しません。何かを入力してからを押してみてください Ctrl + D - 何も起こりません。

いつ bash 入力としてスクリプトを使用して実行されます(例: stdin 最後のバイトが読み込まれると、 read() EOFを返します。この時点でスクリプトは完成しています。 bash 終了します。これは端末と同じ動作です。

プロセスをバックグラウンドで実行した場合(コマンドを終了するには &または使用 Ctrl + Z そして bg その後、あなたはシェルに戻ります。この時点でシェルを殺すことは、それが何をするかに応じて、プロセスに異なる影響を与えます。

  • ファイルとしてのプロセス stdin init(PID 1)によって継承されるようになりました。
  • からパイプを持つプロセス bash として stdin 実行も継続されます... まで 電話しよう read()。この時点で、 read() 失敗し、アプリケーションはエラーを吸収して続行するか、(おそらく)エラーで終了します。

SIGHUP (別名ハングアップ)は、相手側が「ハングアップ」したことをプロセスに知らせるためにプロセスに与えられるシグナルです。これは難解な概念かもしれませんが、この使用法では、SSHクライアントが切断したことをプロセスに通知するか、または子供に通知します。 bash それ bash などを終了しました...

プロセスが明示的に処理しない場合 SIGHUPその後、デフォルトのアクションはそれを終了することです。したがって尋ねる bash しない 送る SIGHUP その子供たちの一人にシェルが去った後に効果的にそれを実行することができます。


最初に土台を置かずにコマンドをバックグラウンドで実行したままにする場合 tmux のより良いバージョンとして screen )その後、あなたは具体的に述べる必要があります」 このプロセスをこのシェルにアタッチしたくない "

これを達成するために、あなたは使うことができます disown ここに参照 しかし、あなたは検索/スクロールする必要があるでしょう)。

disown [-ar] [-h] [jobspec ...]

オプションを指定しないと、各jobspecはアクティブジョブのテーブルから削除されます。 jobspecが存在せず、-aも-rも指定されていない場合は、シェルの現在のジョブの概念が使用されます。 -hオプションを指定すると、各jobspecはテーブルから削除されませんが、シェルがSIGHUPを受け取った場合にSIGHUPがジョブに送信されないようにマークされます。 jobspecが存在せず、-aオプションも-rオプションも指定されていない場合は、現在のジョブが使用されます。 jobspecが指定されていない場合、-aオプションはすべてのジョブを削除またはマークすることを意味します。 jobspec引数を指定せずに-rオプションを指定すると、実行中のジョブに操作が制限されます。 jobspecで有効なジョブが指定されていない限り、戻り値は0です。

プロセスがしようとすると物事はまだおそらくうまくいかないでしょう read() から stdinしたがって、実行中のプロセスを明示的に切断したい場合は、次のどちらかを確認してください。 stdin 指している /dev/null または同様、または使用 tmux 前もって。


注:への書き込み stdout または stderr から読み込もうとするのと同じくらい致命的になるでしょう stdin このような場合は... SIGPIPE ahoy。


リダイレクトするツールを使って可能です。 stdinstdoutstderr デバッグシステムコールを使用することで、実行中のプロセスを終了させることがはるかに安全になります。 この )私が過去に使用したCアプリケーションの名前を覚えているのに苦労していますが、ちょっとした騒ぎが現れました dupx これも役に立つかもしれませんし、少なくとも検討するのが面白いかもしれません。

どちらも、ターゲットプロセス内で基本的に次のことを行うことによって動作します。

fd = open("/dev/null", O_RDONLY);
dup2(fd, stdin);
close(fd);

fd = open("/dev/null", O_WRONLY);
dup2(fd, stdout);
dup2(fd, stderr);
close(fd);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.