すでに開始したプロセスをnohup / screenできますか?


260

SSHを使用して、長時間実行されるデータ移行スクリプトのテスト実行を行っています。午後4時ごろにスクリプトの実行を開始するとします。今、午後6時が動き回りscreenます。

nohupプロセスを「遡及的に」実行する方法はありますか、それともコンピュータを一晩中オンラインのままにしておく必要がありますか?それは添付することはできません場合はscreen/にnohupプロセス私はすでに始めました、そして、なぜ?親/子プロセスがどのように相互作用するかに関係がありますか?(少なくとも「なぜ」の質問に対処しない「いいえ」の回答は受け入れません。申し訳ありません;))


4
についての興味深いブログ投稿を見ましたdisownblogs.oracle.com/ksplice/entry/disown_zombie_children_and_the
ojrac

回答:


212

Bashを使用している場合は、実行できます disown -h job

否認する

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

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


驚くばかり; 私はこのような何かが現れることを望んでいました。
ojrac 09年

7
人生は不公平になる可能性があります。gharperと私はこれをほぼ同時に投稿していました:)
serverhorror

4
あなたは私のヒーロー
トーマスディグナン

9
disownはbashに固有のものではありません。それは、zshの、は、ksh93でもあります...
フィル・P

2
私はあなたが実際に使用する必要がありますことを発見しdisown %1、あなただけの使用ここで、1は、ジョブ仕様であれば、FGやBGとは異なり、bg 1 serverwatch.com/tutorials/article.php/3935306/...
mltsy

81

レプティルを使用

READMEから:

reptyr - A tool for "re-ptying" programs.
-----------------------------------------

reptyr is a utility for taking an existing running program and
attaching it to a new terminal. Started a long-running process over
ssh, but have to leave and don't want to interrupt it? Just start a
screen, use reptyr to grab it, and then kill the ssh session and head
on home.

USAGE
-----

  reptyr PID

"reptyr PID" will grab the process with id PID and attach it to your
current terminal.

After attaching, the process will take input from and write output to
the new terminal, including ^C and ^Z. (Unfortunately, if you
background it, you will still have to run "bg" or "fg" in the old
terminal. This is likely impossible to fix in a reasonable way without
patching your shell.)

著者によるいくつかのブログ投稿:


組み込みのツール(つまりdisown)に固執しますが、reptyrほど柔軟ではありません。+1
ojrac


16

プロセスが開始されると、STDIN、STDOUT、およびSTDERRが何かに接続されます。通常、コマンドを開始すると変更できません。あなたが説明している場合、それはおそらくsshセッションに関連付けられたttyです。nohupはほとんど何もしません...

command < /dev/null > nohup.out 2>&1

つまり、STDINを/ dev / nullに、STDOUTをファイルに、STDERRをSTDOUTに設定します。Screenは、それ自体に直接アクセスするttyのセットアップを含む、はるかに高度なことを行います。

実行中のプロセスを遡及的にnohupまたはスクリーニングする方法は知りません。/ proc / $ pid / fdにcdして、0、1、および2が指すものを確認した場合。

プロセスがSTDIN、STDOUT、またはSTDERRで何かを行おうとする場合はそうではありませんが、disownで多少の幸運があるかもしれません。


2
良いコメントのために+1。st(din | out | err)は問題の残りの半分であり、次にこのジャムにいるとき、どこから探し始めるかについてのアドバイスに感謝します。
ojrac 09年

6
実際、ほとんどのUnixで変更できます。それは嫌なハックです。大好きです。:)あなたがすることは、ptraceのようなデバッグサポートを使用してプロセスに接続し、次にプロセスを強制的にdup2()を呼び出して、0,1,2を別のファイルハンドルに再接続することです。
ザンリンクス

2
はい、変更できます。プロセスの一時停止(SIGSTOP)、およびfd 0、1、2のファイル記述子の変更を伴います。その後、再起動(SIGCONT)します。
マイケル・マルティネス

13

Cryopidは、プロセスをファイルにフリーズするgrab.cの作成者によるさらなる開発であり、それを(画面内で)実行してプロセスを再開します。


1
いいね!プロセス移行に関する修士論文でcryopidを使用しようとしましたが、何をしても、常に機能しませんでした。結局、古いバージョンのLinuxでdynckptを使用する必要がありました。クライオピッドの開発におそらく関わっていますか?あなたの名前は著者のドメインに似ていると思います。
ジュリアーノ

1
私は開発に関わっていません。大学の著者を知っています。彼には現時点でcryopidを維持する時間がありません。したがって、一部の人々はsharesource.org/project/cryopidで
TRS-80

12

画面部分の理由なしに、単純な「いいえ」のみを提供することができます。自分自身の理由に興味があります。

ただしdisown、試してみましたか(bashビルトイン)

~ $ echo $SHELL
/bin/bash
~ $ type disown
disown is a shell builtin
~ $ help disown
disown: disown [-h] [-ar] [jobspec ...]
     By default, removes each JOBSPEC argument from the table of active jobs.
    If the -h option is given, the job is not removed from the table, but is
    marked so that SIGHUP is not sent to the job if the shell receives a
    SIGHUP.  The -a option, when JOBSPEC is not supplied, means to remove all
    jobs from the job table; the -r option means to remove only running jobs.


5

最近、色アスキーアートライブラリlibcacaを使用して構築された画面のようなユーティリティであるneercsへのリンクを見ました。他の機能の中でも特に、既存のプロセスを取得して、それをneercs(スクリーン)セッション内で親に戻すことができます。

ただし、使用したことがないため、機能するかどうかについてはコメントできません。


2

私はおそらくこれを考えていないので、私を自由に修正してください(私はすでに否認について知っています!)...少なくともプロセスをバックグラウンドで実行させるためにctrl-Zと「bg」は機能しませんか?それとも、実行中にSTDOUTを見たいという重要な問題ですか?


1
それは、まだ所有しているttyのはOPは、彼は避けたいものです彼は、コマンド実行をintiatedボックスを残すために必要があるので、死ぬ時にプロセスを殺す
serverhorror

OK、買います。説明ありがとう。ですから、否認-hの提案は、私のものよりもずっと賢く見える
はずです:

1
あなたはまだあなたが-h否認する必要があるだろう直後に、この操作を行うことができます:stackoverflow.com/a/625436/705198を
AndrewPK

2

プロセスと対話できずに生きることができ、ランダムなカーネルモジュールをロードすることに反対しない場合は、Snoopを見るよりも悪いことがあります。または、他のプロジェクトがいくつかあります。ここでは、主にあなたがやりたいことができます1コールinjcode、です。



1

私が使用したいnohup開始する(または類似の)links複雑な認証プロセスでASP.NETのWebサイトからファイルや仕事を使用することが困難になる隠されたビューステートの多くをダウンロードするには、コマンドラインのブラウザをした後、それに接続しますとcurl/ wget

私は最終的に使用tmuxすることになり、それは仕事をうまく解決しました:

  1. 走る tmux
  2. アプリを実行し(links私の場合)、実行したままにします
  3. SSHセッションを閉じると、アプリは実行されたままになります
  4. 後で同じマシンにSSHで接続し、実行tmux attachしてアプリを画面に戻します

tmuxは優れていますが、nohupやscreenと同様に、プロセスを開始する前に使用する場合にのみ機能します。この質問は、プロセスの実行後にtmuxが必要であることに気付いたときのことです。
-ojrac

-1

セッションのタイムアウトが心配ですか?その場合、Ctrl-zを押してプロセスをbgし、「ping -t localhost」または「top」のようにセッションを維持するために、somthingを置くだけです。

ログアウトしたい場合は、他のコメントに追加できないと思います。


それはログアウトのことです。
ojrac 09年

1
切断を停止する別の方法は、topを実行することです。THatは常に数バイトをシャッフルしています。
ロリー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.