web-dev-qa-db-ja.com

bashでジョブリストにプロセスを追加することは可能ですか(たとえば、「否認」を元に戻すため)?

disownbashの仕事をして気が変わった場合、どうにかして元に戻すことはできますか?

もしそうなら、それをさらに進めて、任意のプロセスをジョブ制御下に置くことは可能ですか(許容できる制限は私がプロセスを所有していることです)?

そして最後に、これにより以下のワークフローが可能になりますか?

  • ジョブをバックグラウンドに配置します(^zの後にbgが続きます)
  • pidを取得します(jobs -p %+を取得して<pid>を取得します)
  • screenまたはtmuxセッションを開き、それに接続して、次の手順に使用します
  • reptyrを使用してジョブを取得します(reptyr <pid>
  • シェルのジョブ制御に<pid>を追加します(これはまったく可能ですか?
  • ジョブを停止します(^Z

最後の2つのステップを除いてすべてを行うことができます。プロセスがシェルのジョブリストにないため、^Zでジョブを停止しても機能しません。

私の調査によると、pidをowndisownの逆)にすることはできませんが、うまくいけば私は間違っています...

7
starfry

一般に、シェルがジョブを「採用」することはできません。シェルの場合、ジョブにはいくつかの意味があります。

  • ジョブIDをプロセスIDに関連付けます。
  • そのステータス(実行中、一時停止、デッド)を表示します。
  • ステータスが変化したときにユーザーに通知します。
  • 端末が消えたときにSIGHUP信号を送信します。
  • ジョブが端末を「所有」するかどうか(フォアグラウンドプロセスグループであるかどうか)を制御します。

これらのほとんどは、シェルとジョブの間に特別な関連付けを必要としませんが、必要なものがいくつかあります。

  • ステータスが変化したときにユーザーに通知するために、シェルは SIGCLDシグナル の受信に依存しています。このシグナルは、カーネルによってジョブの初期プロセスの親プロセスに送信されます。
  • 端末へのアクセスを制御するには、シェルがジョブと同じセッションにある必要があります。

プロセスが別のプロセスを採用したり、既存のセッションにプロセスをアタッチしたりすることはできません。したがって、採用をサポートするために、シェルは部分的なステータスを管理する必要があります。通常のシェルはこれを実装していません。

ジョブが最初にそのシェルによって開始され、その後勘当されたジョブである特別な場合では、これらの問題は発生しません。ただし、通常のシェルはいずれも、最初にジョブを開始した場合にジョブを追加できるようにする例外の例外を実装していません。

シナリオでは、通常、画面またはtmuxセッションでジョブを開始し、一時停止または再開する場合はPIDを使用するのが最も便利です。