GNU/Linux >> Linux の 問題 >  >> Linux

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

最も信頼できる方法は次のようです:

(setsid emacs &)

これは ( &) を使用します バックグラウンドに分岐し、setsid 制御 tty から切り離します。

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

fork() { (setsid "[email protected]" &); }

fork emacs

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

  • disown 組み込みコマンド:

    emacs &
    disown $!
    

    & コマンド区切りとして機能し、disown デフォルトでは最新のジョブになるため、次のように短縮できます:

    emacs & disown
    
  • Double-fork() :

    (emacs &)
    

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

  • setsid 新しいセッションを作成してプロセスの制御 TTY の設定を解除するため、Rich が提案したように、これが最良の選択である可能性があります。

    setsid emacs
    

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


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

コンソール アプリの場合は、もちろん閉じる必要があります。入力/出力、より技術的には、それがオンになっていた(疑似)ttyを取り除きました。これがあなたの意図したものである可能性は非常に低いので、X アプリについて話していると仮定しましょう。

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

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

alias emacs='setsid emacs'

または disown を追加 & の後


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


Linux
  1. [Linux]:「tar」シェルコマンドを使用するときにディレクトリを除外する方法

  2. 親が終了した後に子プロセスを終了させる方法は?

  3. ファイルまたはディレクトリが変更されたときにシェルスクリプトを実行する方法は?

  1. シェルスクリプトでフォークされた子プロセスから PID を取得する方法

  2. 重要なプロセスが中断されないようにシャットダウンを無効にする方法は?

  3. Linux - プロセスがいつ開始されたかを確認するにはどうすればよいですか?

  1. Svcadmが停止したサービスを再起動したときに通知を受け取る方法は?

  2. シングル ユーザー モードで 2 番目のシェルを起動するにはどうすればよいですか?

  3. 死ぬことのないプロセスを強制終了する方法は?