detach.sh
次のようなプログラムを端末から安全にデタッチするために、おそらくbashという名前のLinuxシェルスクリプト(できればbash)を作成しようとしています。
呼び出し:
./detach.sh prog [arg1 arg2 ...]
。可能です
exec
、例えば。シェルでこれを実行することによって:exec ./detach.sh prog [arg1 arg2 ...]
適切な引用符付き(主に空白を含む引数の処理)。
出力を破棄します(不要なため)。
screen
、などを使用しませんtmux
(4と同じ理由に加えて、追加のベビーシッタープロセスは必要ありません)。(合理的に)ポータブルなコマンドとプログラムを使用し、
start-stop-daemon
ディストリビューション固有のものはありません。
#!/bin/bash
私はいくつかの方法を考えました(簡潔にするためにシバンの線は無視されています):
nohup
:nohup "$@" >& /dev/null &
disown
:"$@" >& /dev/null & disown
setsid
:setsid "$@" >& /dev/null &
サブシェルの使用:
("$@" >& /dev/null &)
nohup
/setsid
サブシェルと組み合わせる:# Or alternatively: # (nohup "$@" >& /dev/null &) (setsid "$@" >& /dev/null &)
gedit
テストプログラムとして(部品を代用して)使用する場合"$@"
、条件1は上記のすべての方法で満たすことができますが、条件2はなしで満たすことができます。
ただし、任意のプログラム(シェルビルトインではない)がスクリプト5に追加された場合、すべての条件が満たされているように見えます(少なくとも私にとってはgedit
)。例えば:
(setsid "$@" >& /dev/null &)
# Not just `true' because it is also a shell builtin.
/bin/true
上記の現象の説明と要件を正しく実装する方法についてのアイデアを持っている人はいますか?
編集:
条件2では、プログラムを端末から切り離す必要がありますが、それ以外の場合は通常どおり実行されます。たとえば、この場合、スクリプトのプロセスが終了した直後に終了するgedit
と、条件は失敗します。gedit