回答:
これがXアプリとして実行されているのか、コンソールアプリとして実行されているのかは言及しません。
コンソールアプリとして使用する場合は、もちろん終了する必要があります。入出力、より厳密には(擬似)ttyを削除しました。これがあなたの意図することではないので、Xアプリについて話していると仮定しましょう。
nohup
動作するはずですが、動作しない理由はわかりません。シェルが閉じると、SIGHUP
プロセスグループ内のすべてのプロセスに送信されます。nohupは、SIGHUPを無視するようコマンドに指示します。
また、setsidを試すこともできます。これは、プロセスをプロセスグループから切断します
alias emacs='setsid emacs'
またはdisown
後に追加&
最も信頼性の高い方法は次のとおりです。
(setsid emacs &)
これは( &)
、バックグラウンドへの分岐、およびsetsid
制御端末からの切り離しに使用されます。
これをシェル関数に入れることができます:
fork() { (setsid "$@" &); }
fork emacs
可能性は次のとおりです。
disown
組み込みコマンド:
emacs &
disown $!
&
コマンドセパレータとして機能し、disown
デフォルトで最新のジョブになります。したがって、これは次のように短縮できます。
emacs & disown
ダブルfork()
:
(emacs &)
括弧内のコマンド(
)
は、別のシェルプロセスで実行されます。
setsid
Richが示唆するように、新しいセッションを作成することでプロセスの制御TTYを設定解除するため、最良の選択かもしれません。
setsid emacs
ただし、これは少し予測不能です- fork()
プロセスグループのリーダーである場合にのみバックグラウンドになります(たとえばsetsid
、sh
スクリプトで使用された場合は発生しません。そのような場合、Ctrl- C.)
(exec emacs)
うまくいく?
(emacs)
。サブシェルに単一のコマンドが与えられたexec
場合、少なくともの場合、が暗示されbash
ます。bash -c 'foo'
対にも同じことが当てはまりますbash -c 'exec foo'
。(ただし、emacs 自体が端末から切り離される可能性があることに注意してください。たとえば、gvimはこれを行います。動作が既知のプログラムでテストすることをお