これは不可能です。

これは不可能です。

シェルを終了したときにプロセスが停止するのを防ぐために、またはを介してnohupコマンドを開始できますscreen。次のコマンドを使用して既存のプロセスを拒否することもできます。

mycommand
# Press CTRL-Z
bg
disown %1

ただし、これは現在のシェルでのみ開始できます。

別のシェル/ sshセッションを使用して同じことをしたいと思います(コマンドで始まります)。シェルしかし、リリースが拒否されましたシェルB)。

他のシェルからプロセスをバックグラウンドに配置できます。

# CTRL-Z can be done via
kill -20 PID (SIGSTP)
# bg can be done via
kill -18 PID (SIGCONT)

しかし、プロセスはまだ初期シェルの所有です。他のシェルのプロセスをどのように拒否できますか?

私はLinux 4.15を使用しています。

ベストアンサー1

これは不可能です。

素晴らしい、これはデバッガを使用してシェルプログラムを実行するプロセスの内部を掘り下げる準備ができたら。より具体的には、シェルプログラミングレベルではこれは簡単な方法では不可能です。

disownこれは、シェルが各個々のシェルプロセスのメモリスペースに保持する「作業」リストに影響を与えるためです。

シェル(つまり、ジョブ制御プロセス)は、そのプロセスを忘れるように指示されるまで、内部の「作業テーブル」から分岐したサブプロセスを記憶するか、サブプロセスが終了し、シェルが終了したタスクをdisown実行して報告するまで子プロセスには影響しませんwait()disownプロセス プロセス状態何らかの方法で。これはシェルの機能に影響を与えます。

disownカリキュラムを忘れてしまうから…

  • wait()…子供を解雇すると通知すると、もはや「作業」の完了を認めません。
  • exit... /と言うと、プロセスがまだ実行されているかどうかはもう気にしませんlogout
  • ...自体プロセスが中断シグナルを受信したとき(または一部のシェルプログラムの場合は終了して対話型ログインシェルであることを認識するとき)、サブプロセスに中断シグナルを送信しなくなりました。

シェルはこれらのリストを共有せず、他のプロセスから簡単にアクセスできません(上記のようにデバッガを起動して接続しないでください)。disown関連するシェルプロセス自体内で実行される組み込みコマンドに加えて、それにアクセスできるIPCメカニズムやコマンドラインツールはありません。 (これはなぜこれは組み込みコマンドです。 )

そのため、disown同じログインセッション内でも2番目のシェルでジョブを実行することはできません。 disownそれは完全に各シェルと各シェルプロセスの問題です。

また…

プロセスは他のシェルでバックグラウンドで実行できます。

実際、それはあなたがいつもすることではありません。

コンセプト展望そして背景セッションの制御端末に関する。具体的には、制御端末はプロセスグループ、すなわちフォアグラウンドプロセスグループ。プロセス自体を停止して続行しても、プロセスがフォアグラウンドとバックグラウンドの間で切り替えられるわけではありません。端末を制御するフォアグラウンドプロセスグループを更新する必要があります。しかも。 ㅏフォアグラウンドプロセスこれは前景プロセスグループのメンバーであるため、前景にあります。セッション内の他のすべてのプロセスグループとこれらのプロセスグループのプロセスはバックグラウンドにあります。

皮肉なことに、他のシェルはこれを行いません。あなたがやっていることが触発されています。元のシェルプロセスがアクションをとります。。前景プロセスグループの基本プロセスが停止することを確認し、それに応答して端末の前景プロセスグループを調整します(セルフプロセスグループに戻る)。

SIGTSTPところで、正しい信号です。

追加読書

おすすめ記事