回答:
Linuxのジョブとプロセスの所有権がどのように機能するかを考えると、採用プロセスの助けがなければ、プロセスを再所有することは実際には不可能です。
親は子を「無視する」ことができ、子は「init」という名前のプロセスによって「採用」されます。システムセキュリティは、誰かが他の誰かのプロセスを取得するのを防ぎます。あなたがそれを否認するとき、プロセスは制御する他の誰か(初期化)になります。「ユーザー」としてのあなたはまだプロセスを殺すことができますが、それを取り戻すことはできません。initはメールを読み取らないため、プロセスを返すようにinitを強制しようとしても機能しそうにありません。
どうやらそれは、「それをしないで!」という答えに要約されます。
reptyr
(使用例については私の回答をご覧ください)。
間違ったプロセスを否認したという不幸な状況にある人にはこれは役に立たないと思いますが、ワークフローから否認を追放してそれを次のように置き換えた場合:
https://github.com/nelhage/reptyr
プロセスの親を変更することができます(つまり、画面内に移動する)。
reptyr
解決策ですが、の使用を停止する必要はありませんdisown
。明確にするために、新しい答えを書きました。
必要なのはreptyr
。それはに住んでGitHubにも、他のGNU / Linuxディストリビューションのために、おそらくとWheezyに以来のDebianのためにパッケージ化されてきた、と。プロセスID(PID)を使用して呼び出した場合、現在のターミナルで不承認のプロセスをフォアグラウンドにします。たとえば、次のとおりです。
pgrep -f DISOWNED_PROCESS # to find out the PID of the disowned process
reptyr PID # insert this PID here
申し訳ありません。原則として、否認はシェルの内部状態を変更するだけなので、基本的には可能です。基本的にリストからプロセスIDを削除し、あまり手間をかけずに戻すことができます(テストでは少し注意する必要があります)再アタッチされたpidは適切なセッションにありますが、それは克服できません。ただし、通常のシェル(bash、ksh、tcsh、zsh)には、再追加する方法がないようです。(zshのとあなたが書くことができますがjobstates
、jobdirs
とjobtext
連想配列;私はあなたがそのように実現することができますどのくらいかわかりません。)
所有するサブプロセスの場合と同様に、シェルが非所有プロセスにシグナルを送信するようにする場合、シグナルを受信し、非所有プロセスに同じシグナルを送信するまで待機するスタブジョブを作成できます。+ とをシミュレートするために、否認されたプロセスにSIGSTOP
とSIGCONT
を送信できます。これは、再所有ほど便利ではありません。CtrlZbg
状況は何ですか?端末をしばらく元に戻したい場合は、代わりにGNU Screenを使用できます。端末からプロセスを完全に切り離すわけではありません-Screenはプロセスの利益のために1つをエミュレートします-しかし、使用している実際の端末から接続および切り離すことができます。画面をデタッチしてログアウトし、再度ログインして同じ画面に再接続することもできます。