web-dev-qa-db-ja.com

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

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

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

31
nisc

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

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

意外と言うと、「やらないで!」.

16
lornix

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

https://github.com/nelhage/reptyr

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

19
Thom

必要なのはreptyrだけです。 GitHub にあり、Wheezy以降Debian向けにパッケージ化されており、おそらく他のGNU/Linuxディストリビューション向けにもパッケージ化されています。プロセスID(PID)を使用して呼び出した場合、現在のターミナルで不許可のプロセスがフォアグラウンドになります。だから例えば:

pgrep -f DISOWNED_PROCESS  # to find out the PID of the disowned process
reptyr PID                 # insert this PID here
11

申し訳ありません。原則として、不許可は一部のシェルの内部状態を変更するだけなので可能です。基本的にはリストからプロセスIDが削除され、手間をかけずに元に戻すことができます(テストに少し注意する必要があります)。再接続されたPIDは正しいセッションにありますが、それを超えることはできません)。しかし、通常のシェル(bash、ksh、tcsh、zsh)はどれも、再度追加する方法がないようです。 (zshを使用すると、jobstatesjobdirsおよびjobtext連想配列に書き込むことができます。その方法でどれだけ達成できるかはわかりません。)

シェルが所有されているサブプロセスの場合と同じように、所有されていないプロセスにシグナルを送信する場合は、シグナルを受信して​​、所有されていないプロセスに同じシグナルを送信するまで待機するスタブジョブを記述できます。 SIGSTOPSIGCONTを不名誉プロセスに送信してシミュレーションすることができます Ctrl+Z およびbg。これはどれも、再所有ほど便利ではありません。

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

0
Scott