シェルを終了したときにプロセスが停止するのを防ぐために、またはを介して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
ところで、正しい信号です。
追加読書
答え2
Solarisを使用している場合は、次のように電話できます。
nohup -p <pid>
これにより、現在の制御端末が削除され、stdoutがファイルシステムのファイルに接続されます。
これを行うには、カーネル(この場合は/ procファイルシステム)のサポートが必要です。 Solarisは2001年にこのプログラムのサポートを追加しましたnohup
。他のプラットフォームが他の端末で実行されているプロセスにデバッガを接続できる場合は、この機能を追加できます。
注:プロセスが以前に実行されていたシェルを調べると、シェルのwait()呼び出しに「子プロセスなし」エラーメッセージが表示されることがあります。
現在、他のプラットフォームで同様の構造を認識していません。