disown
仕事を終えて気が変わったらbash
どうにかキャンセルできますか?
それでは、さらに一歩進んで、任意のプロセスをタスク制御下に置くことは可能ですか?
最終的に次のようなワークフローが可能になります。
- ジョブをバックグラウンドに配置します(
^z
次にbg
)。 - pidを入手してください(
jobs -p %+
入手してください<pid>
) screen
または、セッションを開いてtmux
接続し、それを使用して次の手順を実行します。- 雇用を取得するために使用されます
reptyr
(reptyr <pid>
) <pid>
シェルにジョブコントロールが追加されました(これは可能ですか?)- やめなさい(
^Z
)
最後の2段階だけを除いてはやります。^Z
プロセスがシェルのジョブリストにないため、ジョブの停止を使用しても効果はありません。
私の研究によると不可能です。私自身(代わりにdisown
)a pidが私が間違っていることを願っています...
ベストアンサー1
通常、シェルがタスクを「採用」することは不可能です。シェルの場合、アクションは次のことを意味します。
- ジョブ識別子をプロセスIDに関連付けます。
- ステータス(実行中、一時停止、終了)を表示します。
- 状態が変わるとユーザーに通知します。
- 端子が消えたら、SIGHUP 信号を送信します。
- ジョブが端末を「所有」するかどうか(前景プロセスグループにあるかどうか)を制御します。
ほとんどはシェルとアクションの間に特別な関連付けを必要としませんが、いくつかは次のことを行います。
- 状態が変更されると、ユーザーに通知するためにシェルは受信に依存します。SIGCLD信号。この信号は、カーネルによってジョブ初期プロセスの親プロセスに送信されます。
- 端末へのアクセスを制御するには、シェルがジョブと同じセッションにある必要があります。
プロセスが別のプロセスを採用したり、既存のセッションにプロセスを添付したりすることはできません。したがって、採用をサポートするには、シェルでいくつかの状態を管理する必要があります。通常のシェルはまだこれを実装していません。
特別なケースでは、このシェルによって最初に開始された後に操作が拒否された場合、これらの問題は発生しません。ただし、通常のシェルのいずれも、最初の起動時にジョブを追加できる例外を実装しません。
あなたのシナリオでは、通常、画面またはtmuxセッションでタスクを開始するのが最も便利です。タスクを一時停止または再開したい場合は、PIDを使用できます。