Bash / ZSH:「disown」の取り消し


30

プロセスが「無視」された後、シェルジョブテーブルにプロセスを「再アタッチ」する方法はありますか?

編集:$ SEARCHENGINEは完全に私を失敗します。見栄えがよくありません。

回答:


16

Linuxのジョブとプロセスの所有権がどのように機能するかを考えると、採用プロセスの助けがなければ、プロセスを再所有することは実際には不可能です。

親は子を「無視する」ことができ、子は「init」という名前のプロセスによって「採用」されます。システムセキュリティは、誰かが他の誰かのプロセスを取得するのを防ぎます。あなたがそれを否認するとき、プロセスは制御する他の誰か(初期化)になります。「ユーザー」としてのあなたはまだプロセスを殺すことができますが、それを取り戻すことはできません。initはメールを読み取らないため、プロセスを返すようにinitを強制しようとしても機能しそうにありません。

どうやらそれは、「それをしないで!」という答えに要約されます。


1
これは正しくありえません。親プロセスは、終了することを除いて、子を採用させることはできません。説明する動作は、子プロセスから(または親が死んだ場合に自動的にこれの一部を行うカーネルによって)トリガーされる必要があります。プロセスは自発的に子供を養子にすることはできませんが、子供をあきらめることもできません。
ジル

1
謝罪いたします。私のせい。過度に単純化しすぎました。bashソースを再度実行しても、bashは引き続き所有権を保持しますが、子プロセスに渡されるため息を抑制します。そのため、元に戻すことは可能かもしれませんが、bashにはまだ組み込まれていません。なんらかの理由で、私はinitの孤児とゾンビの収穫にこだわった。
lornix

@lomixええ、しかし、あなたがそれを否認したシェルを終了すると、それは1のppidを取得するので、あなたの推論は有効です。とにかく出て行かない限り、誰が否認するか:p
Orwellophile

1
申し訳ありませんが、この答えは間違っています。使用するだけですreptyr(使用例については私の回答をご覧ください)。
クリスチャンピーチュ

18

間違ったプロセスを否認したという不幸な状況にある人にはこれは役に立たないと思いますが、ワークフローから否認を追放してそれを次のように置き換えた場合:

https://github.com/nelhage/reptyr

プロセスの親を変更することができます(つまり、画面内に移動する)。


2
まあ、私はreptyrで私の知らないvimプロセスを取り戻したので、それは私が探していたundisownユーティリティと同じように機能しました。
hlovdal

あなたは正しい、@ hlovdal:この答えは半端です。reptyr解決策ですが、の使用を停止する必要はありませんdisown。明確にするために、新しい答えを書きました。
クリスチャンピーチュ

11

必要なのは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

2
(sudo apt-get install reptyr)その後、最初の試行でこれを取得しました:「アタッチ中にカーネルが許可を拒否しました。uidがターゲットのものと一致する場合、/ proc / sys / kernel / yama / ptrace_scopeの値を確認します。詳細については、 /etc/sysctl.d/10-ptrace.conf "両方の場所の値を1から0に変更し、機能しました。同じユーザーとしてプロセスの否認とレプティアーをテストしました(ubuntu 14.04 LTSのipythonノートブック)。おそらく、これは隔離された環境での開発には問題ありません...しかし、変更による最終的なセキュリティの影響はわかりません。たぶん、専門知識を持っている人が
鳴り響く

1

申し訳ありません。原則として、否認はシェルの内部状態を変更するだけなので、基本的には可能です。基本的にリストからプロセスIDを削除し、あまり手間をかけずに戻すことができます(テストでは少し注意する必要があります)再アタッチされたpidは適切なセッションにありますが、それは克服できません。ただし、通常のシェル(bash、ksh、tcsh、zsh)には、再追加す​​る方法がないようです。(zshのとあなたが書くことができますがjobstatesjobdirsjobtext連想配列;私はあなたがそのように実現することができますどのくらいかわかりません。)

所有するサブプロセスの場合と同様に、シェルが非所有プロセスにシグナルを送信するようにする場合、シグナルを受信し、非所有プロセスに同じシグナルを送信するまで待機するスタブジョブを作成できます。+ とをシミュレートするために、否認されたプロセスにSIGSTOPSIGCONTを送信できます。これは、再所有ほど便利ではありません。CtrlZbg


0

状況は何ですか?端末をしばらく元に戻したい場合は、代わりにGNU Screenを使用できます。端末からプロセスを完全に切り離すわけではありません-Screenはプロセスの利益のために1つをエミュレートします-しかし、使用している実際の端末から接続および切り離すことができます。画面をデタッチしてログアウトし、再度ログインして同じ画面に再接続することもできます。


6
状況は次のとおりです。間違ったプロセスを否認し、それを取り戻したい。
nisc

1
あ。もっと強く。画面を予測する必要があります。
スコット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.