リダイレクトを使用しているシェルコマンドを完全にフォークする方法


13

私は長年にわたってかなりの数のシェルスクリプトを書いている(しかし、私は確かにシステム管理者ではないよ)といつも私を引き起こしたことがあるの何かトラブル:どのように私はからバックグラウンドでハングアップするシェルコマンド免疫をforkできるのBashスクリプト?

たとえば、これがある場合:

command_which_takes_time input > output

これを「nohup」してフォークするにはどうすればよいですか?

以下は私が望むことをしていないようです:

nohup command_which_takes_time input > output &

私が探している構文は何ですか?理解していないものは何ですか?

回答:


13

サブシェルを作成してみてください(...)

( command_which_takes_time input > output ) &

例:

~$ ( (sleep 10; date) > /tmp/q ) &
[1] 19521
~$ cat /tmp/q # ENTER
~$ cat /tmp/q # ENTER
(...) #AFTER 10 seconds
~$ cat /tmp/q #ENTER
Wed Jan 11 01:35:55 CET 2012
[1]+  Done                    ( ( sleep 10; date ) > /tmp/q )

18

試してみてくださいsetsid(1)。あなたが使用するようにそれを使用してくださいnohup

setsid command_which_takes_time input > output

これは、(につきとしてsetsid(2)、ないmanページ)fork(2)_exit(2)親プロセスのは、その後、子プロセスの呼び出しは、setsid(2)新しいプロセスグループ(セッション)を作成します。

ログアウトすることでそれを殺すことはできません。また、それはBashジョブ制御シバンの一部ではありません。すべての意図と目的のために、それは適切なデーモンです。


4

そこにあるdisownbashの組み込みコマンドは:

[1] 9180
root@ntb1:~# jobs
[1]+  Running                 sleep 120 &
root@ntb1:~# disown
root@ntb1:~# jobs
... no jobs, disowned
root@ntb1:~# ps aux | grep sleep | grep -v grep
root      9180  0.0  0.0   4224   284 pts/0    S    17:55   0:00 sleep 120
... but the sleep still runing
root@ntb1:~#

disownの後、ジョブはシェルからdisownされ(ログアウトすることもできます)、終了するまで実行されたままになります。

第一参照jobsコマンドが記載されているsleepしかし、第二のjobs否認はしなかった後。しかし、psを使用すると、ジョブがまだ実行されていることがわかります。



-2

これは動作します(余分なスペースを入力しないでください):

command &>output.file

1
これは、に相当するものを分岐または達成しないため、質問とは無関係のようですnohup
ダン・ゲッツ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.