web-dev-qa-db-ja.com

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

私は何年にもわたってかなりの数のシェルスクリプトを記述してきました(ただし、私は確かにシステム管理者ではありません)常に問題を引き起こしているものがあります:Bashスクリプト?

たとえば、私がこれを持っている場合:

command_which_takes_time input > output

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

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

Nohup command_which_takes_time input > output &

私が探している構文は何ですか、何がわからないのですか?

13
Cedric Martin

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

( 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 )
13

setsid(1)を試してください。 Nohupと同じように使用します。

_setsid command_which_takes_time input > output
_

これは(setsid(2)マンページに従って)、親プロセスのfork(2)_exit(2)を実行し、子プロセスはsetsid(2)を呼び出します新しいプロセスグループ(セッション)を作成します。

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

18
Alexios

disown bash組み込みコマンドがあります:

[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の後、ジョブはシェルから否認され(ログアウトも可能)、ジョブは完了するまで実行されたままになります。

jobsにリストされている最初のsleepコマンドを参照してください。ただし、否認後の2番目のjobsはそうではありませんでした。しかし、psを使用すると、ジョブがまだ実行中であることがわかります。

4
Daniel Péder

Freebsd:

/usr/sbin/daemon -f <command> <command args>
2
h0tw1r3