シェルが終了したときに死なないプロセスをフォークするにはどうすればよいですか?


31

シェルからemacsを実行する場合:

$ emacs foo &

そして、そのシェルを殺すと、emacsは死にます。

シェルが死んだときにコマンドが死なないようにコマンドを実行するにはどうすればよいですか?

nohupへの参照を見つけましたが、それは役に立たないようです:

$ nohup emacs foo &

シェルが死んだとき、まだemacsを殺します。

回答:


13

これがXアプリとして実行されているのか、コンソールアプリとして実行されているのかは言及しません。

コンソールアプリとして使用する場合は、もちろん終了する必要があります。入出力、より厳密には(擬似)ttyを削除しました。これがあなたの意図することではないので、Xアプリについて話していると仮定しましょう。

nohup動作するはずですが、動作しない理由はわかりません。シェルが閉じると、SIGHUPプロセスグループ内のすべてのプロセスに送信されます。nohupは、SIGHUPを無視するようコマンドに指示します。

また、setsidを試すこともできます。これは、プロセスをプロセスグループから切断します

alias emacs='setsid emacs'

またはdisown後に追加&


ああ、素晴らしいsetsid作品。明確ではないことを申し訳ありません。はい、実際にはシェルで実行されないXアプリを参照しています。基本的に、シェルからemacs(または他のプロセス)を起動したいのですが、シェルに結び付けられたくないのです。便宜上、そこから始めています。
sligocki

41

最も信頼性の高い方法は次のとおりです。

(setsid emacs &)

これは( &)、バックグラウンドへの分岐、およびsetsid制御端末からの切り離しに使用されます。

これをシェル関数に入れることができます:

fork() { (setsid "$@" &); }

fork emacs

可能性は次のとおりです。

  • disown組み込みコマンド:

    emacs &
    disown $!
    

    &コマンドセパレータとして機能し、disownデフォルトで最新のジョブになります。したがって、これは次のように短縮できます。

    emacs & disown
    
  • ダブルfork()

    (emacs &)
    

    括弧内のコマンド( )は、別のシェルプロセスで実行されます。

  • setsidRichが示唆するように、新しいセッションを作成することでプロセスの制御TTYを設定解除するため、最良の選択かもしれません。

    setsid emacs
    

    ただし、これは少し予測不能です- fork()プロセスグループのリーダーである場合にのみバックグラウンドになります(たとえばsetsidshスクリプトで使用された場合は発生しません。そのような場合、Ctrl- C.)


すばらしいです!これらはすべて私のために働く。私の武器庫にいくつかのツールを追加できて嬉しい。
sligocki

うーん... (exec emacs)うまくいく?
Hello71

@Hello:だけと変わりません(emacs)。サブシェルに単一のコマンドが与えられたexec場合、少なくともの場合、が暗示されbashます。bash -c 'foo'対にも同じことが当てはまりますbash -c 'exec foo'。(ただし、emacs 自体が端末から切り離される可能性があることに注意してください。たとえば、gvimはこれを行います。動作が既知のプログラムでテストすることをお
勧めし

ダブルフォーク技術を学ぶのは素晴らしい。ありがとう!
デイブアブラハムズ

私自身の問題を解決するためにトローリング中にこれを見つけました。(setsid emacs&)は私のために働いた。よく書かれた答えをありがとう。
ポールブ

5

シェルの設定を確認してください。の代わりにscreenを試すこともできますnohup


Screen screen -rを使用Ctrl-A Ctrl-Dすると、ログアウトする前に切断するために使用すると、後でプロセスに戻ることができます。
ブラム

これは非常に良い点です。私は反対の、つまりサブシェルをフォークし、その完了を待たずに他のタスクを続行する必要がありましたscreen -d -m sh -c "{do stuff } exit"が、もっと理にかなっています。
ニモ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.