私は何年にもわたってかなりの数のシェルスクリプトを記述してきました(ただし、私は確かにシステム管理者ではありません)常に問題を引き起こしているものがあります:Bashスクリプト?
たとえば、私がこれを持っている場合:
command_which_takes_time input > output
「ノーフ」とこれをフォークするにはどうすればよいですか?
以下は私が望むことをしていないようです:
Nohup command_which_takes_time input > output &
私が探している構文は何ですか、何がわからないのですか?
(...)
でサブシェルを作成してみてください:
( 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 )
setsid(1)
を試してください。 Nohup
と同じように使用します。
_setsid command_which_takes_time input > output
_
これは(setsid(2)
マンページに従って)、親プロセスのfork(2)
、_exit(2)
を実行し、子プロセスはsetsid(2)
を呼び出します新しいプロセスグループ(セッション)を作成します。
ログアウトすることでそれを殺すことはできず、それはBashジョブコントロールShebangの一部ではありません。すべての意図と目的にとって、それは適切なデーモンです。
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
を使用すると、ジョブがまだ実行中であることがわかります。
Freebsd:
/usr/sbin/daemon -f <command> <command args>