web-dev-qa-db-ja.com

すでに開始されているプロセスをNohup /スクリーニングできますか?

SSHを使用して、長時間実行されるデータ移行スクリプトのテストを実行しています。午後4時頃にスクリプトの実行を開始したとします。今、6 PM転がり、screenでこれをすべて実行しなかったので自分を呪っています。

プロセスを「遡及的」にNohupする方法はありますか、またはコンピュータを一晩オンラインのままにする必要がありますか?既に開始したプロセスにscreenNohupにアタッチできない場合は、なぜですか?親/子プロセスがどのように相互作用するかと関係がありますか? (「なぜ」の質問に少なくとも対処しない「いいえ」の回答は受け付けません-ごめんなさい;))

262
ojrac

Bashを使用している場合は、disown -h job

disown

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

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

212
gharper

reptyrを使用します

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.)

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

82
Jonathan Tran

1つのttyから現在のttyにプロセスを盗むには、次のハックを試してください。

http://www.ucc.asn.au/~dagobah/things/grab.c

現在のLinux/glibcバージョンにコンパイルするためには、再フォーマットが必要ですが、まだ機能します。

22
Juliano

プロセスが開始すると、STDIN、STDOUT、およびSTDERRがsomethingに接続されます。一般に、コマンドが開始されると、それを変更することはできません。あなたが説明しているケースでは、それはおそらく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が何を指しているかを確認するとします。

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

17
freiheit

画面部分の理由がなければ、私はあなたに単純な「いいえ」を与えることができるだけです、私はあなた自身の理由に興味があります。

ただし、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.
13
serverhorror

Cryopid は、プロセスをファイルにフリーズするgrab.cの作成者が開発したもので、(画面内で)実行してプロセスを再開します。

13
TRS-80

Solaris/OpenSolarisのNohupには、実行中のプロセスをNohupする-pフラグがあります。たとえば、 Solaris 10 Nohupのマニュアルページ を参照してください。

9
alanc

最近、カラーアスキーアートライブラリであるlibcacaを使用して構築された画面のようなユーティリティである neercs へのリンクを見ました。他の機能の中でも特に、既存のプロセスを取得し、Nercs(画面)セッション内で再ペアレント化する機能を備えています。

まだ使っていないので、動作するかどうかはコメントできません。

5
Daniel Lawson

プロセスの出力をgdbでファイルにリダイレクトできます

https://blog-en.openalfa.com/how-to-detach-from-the-terminal-a-running-process-in-linux

そしてそれを否認する

Upd:Ubuntu 18.04では、Sudoと少し異なるgdbコマンドを使用してgdbを実行する必要がありました。

p (int)dup2(open("/tmp/test.stdout", 1), 1)

2
d9k

私はおそらくこれをあまり考えていないので、自由に修正してください(私はすでにdisownについて学びました!)... ctrl-Zと "bg"は、少なくともプロセスがバックグラウンドで実行されるように機能しませんか?それとも、実行中にSTDOUTを表示したい重要な問題ですか?

2
Chris_K

プロセスと対話できない状態で生活でき、ランダムカーネルモジュールのロードに異議を唱えない場合、 Snoop を確認するよりも悪い結果になる可能性があります。あるいは、他にもいくつかのプロジェクトがあります。 ここ は1つの呼び出しinjcodeであり、たいていの場合、やりたいことを実行できます。

2
David Pashley

Nohup(または同様の)を使用してlinksコマンドラインブラウザーを起動し、それに接続して、複雑な認証プロセスと多くの処理を伴うASP.NET Webサイトからファイルをダウンロードしたいと思いました。 curl/wgetを使用してジョブを実行するのを難しくした非表示のビューステート。

私はついにtmuxを使用することになりました。

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