SSHを使用して、長時間実行されるデータ移行スクリプトのテストを実行しています。午後4時頃にスクリプトの実行を開始したとします。今、6 PM転がり、screen
でこれをすべて実行しなかったので自分を呪っています。
プロセスを「遡及的」にNohup
する方法はありますか、またはコンピュータを一晩オンラインのままにする必要がありますか?既に開始したプロセスにscreen
をNohup
にアタッチできない場合は、なぜですか?親/子プロセスがどのように相互作用するかと関係がありますか? (「なぜ」の質問に少なくとも対処しない「いいえ」の回答は受け付けません-ごめんなさい;))
Bashを使用している場合は、disown -h job
disown [-ar] [-h] [jobspec ...]
オプションがない場合、各jobspecはアクティブなジョブのテーブルから削除されます。
-h
オプションが指定されている場合、ジョブはテーブルから削除されませんが、シェルがSIGHUPを受信した場合にSIGHUPがジョブに送信されないようにマークされます。 jobspecが存在せず、-a
または-r
オプションを指定すると、現在のジョブが使用されます。 jobspecが指定されていない場合、-a
オプションは、すべてのジョブを削除またはマークすることを意味します。-r
オプションをjobspec引数なしで実行すると、操作は実行中のジョブに制限されます。
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.)
著者によるいくつかのブログ投稿:
1つのttyから現在のttyにプロセスを盗むには、次のハックを試してください。
http://www.ucc.asn.au/~dagobah/things/grab.c
現在のLinux/glibcバージョンにコンパイルするためには、再フォーマットが必要ですが、まだ機能します。
プロセスが開始すると、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で何かを行おうとする場合はそうではありません。
画面部分の理由がなければ、私はあなたに単純な「いいえ」を与えることができるだけです、私はあなた自身の理由に興味があります。
ただし、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.
Cryopid は、プロセスをファイルにフリーズするgrab.cの作成者が開発したもので、(画面内で)実行してプロセスを再開します。
Solaris/OpenSolarisのNohupには、実行中のプロセスをNohupする-pフラグがあります。たとえば、 Solaris 10 Nohupのマニュアルページ を参照してください。
最近、カラーアスキーアートライブラリであるlibcacaを使用して構築された画面のようなユーティリティである neercs へのリンクを見ました。他の機能の中でも特に、既存のプロセスを取得し、Nercs(画面)セッション内で再ペアレント化する機能を備えています。
まだ使っていないので、動作するかどうかはコメントできません。
プロセスの出力を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)
私はおそらくこれをあまり考えていないので、自由に修正してください(私はすでにdisownについて学びました!)... ctrl-Zと "bg"は、少なくともプロセスがバックグラウンドで実行されるように機能しませんか?それとも、実行中にSTDOUTを表示したい重要な問題ですか?
Nohup
(または同様の)を使用してlinks
コマンドラインブラウザーを起動し、それに接続して、複雑な認証プロセスと多くの処理を伴うASP.NET Webサイトからファイルをダウンロードしたいと思いました。 curl
/wget
を使用してジョブを実行するのを難しくした非表示のビューステート。
私はついにtmux
を使用することになりました。
tmux
を実行しますlinks
)、実行したままにしますtmux attach
を実行してアプリを画面に戻します