web-dev-qa-db-ja.com

ファイル処理デーモンを開始するにはどうすればよいですか?

到着時に特定のディレクトリに継続的にダウンロードされたファイルを処理するスクリプトベースのツールを実行するにはどうすればよいですか?遅延を最小限に抑えたいのですが(約1秒で問題ありません)、スクリプトは独自の無限ループを持つことができます。

私は次のようないくつかの方法を知っています:

  • .bashrcまたは.profileを使用してスクリプトを呼び出す自動ログインユーザー
  • cronからスクリプトをフォークし、すでに実行されている場合は無視します
  • どういうわけかinitスクリプトを使用します(ディストリビューションによって異なると思います)

どの方法が最も効果的ですか?

4
tomash

スクリプトがLinuxで実行されると仮定すると、initスクリプトから inotifywait を使用できます。ダウンロードツリー全体を再帰的に検索することをお勧めします(オプション-r)。監視する各ノード 最大1kBのカーネルメモリを消費する可能性がある であることに注意してください。

inotifyの主な利点は、コストのかかるポーリングループを防ぐことです。監視対象のディレクトリツリーでファイル操作が行われるとすぐにイベントがトリガーされ、それ以外の場合は目立たないCPUリソースが消費されます。

2
user86969

どういうわけかinitスクリプトを使用します(ディストリビューションによって異なると思います)

確かにそうです。これがsystemdの方法で、System 5 rcスクリプトはまったく含まれていません。 2台です。それらは非パッケージ非システムユニットであるため、/etc/systemd/systemに入ります。 1つ目は、プログラムをデーモンとして実行することを説明するサービスユニットです。

#/ etc/systemd/system/example-spooler.service 
 
 [Unit] 
 Description =/var/spool/example/[内のファイルを処理します。 ____。] Documentation = http://unix.stackexchange.com/questions/203637/

[Service]
ExecStart =/usr/local/bin/example-spooler/var/pool/example /

このサービスを明示的に開始または停止する必要はないことに注意してください。 パスがアクティブ化されています。 systemdが監視するパスとそれが探すパスを記述するpath unitは、2番目のユニットファイルです。

#/ etc/systemd/system/example-spooler.path 
 
 [Unit] 
 Description =/var/spool/example /を監視してexample-をアクティブ化するscroller.service 
 Documentation = http://unix.stackexchange.com/questions/203637/

[Path]
DirectoryNotEmpty=/var/spool/example/
 
 [インストール] 
 WantedBy = multi-user.target 

ブートストラップでこれを自動開始するには、systemctl preset example-spooler.pathを実行します。今すぐ開始するには、systemctl start example-spooler.pathを実行します。

参考文献

  • レナート・ポッターリング(2013-10-07)。 systemd.path 。 systemdのマニュアルページ。 freedesktop.org。
11
JdeBP