こんな感じでやった気がするメモ
環境
- ubuntu16.40
- python2.7
Install Python ライブラリ
pip install watchdog
(スクリプト実行時に依存関係でエラーになる場合があるのでその都度必要なライブラリをインストール)
特定のディレクトリを監視する python スクリプト
ファイルが作成・変更された場合に _func() を実行
- ~/hoge.py
# coding=utf-8 import logging import time from watchdog.observers import Observer from watchdog.events import PatternMatchingEventHandler logger = logging.getLogger(__name__) class HogeHandler(PatternMatchingEventHandler): def __init__(self, patterns): super(HogeHandler, self).__init__(patterns=patterns) def on_moved(self, event): logging.info('Moved: from {} to {}'.format(event.src_path, event.dest_path)) def on_created(self, event): logger.info('Created: {}'.format(event.src_path)) def on_deleted(self, event): logger.info('Deleted: {}'.format(event.src_path)) def on_modified(self, event): logger.info('Modified: {}'.format(event.src_path)) self._func(event.src_path) def _func(self, src_path): logger.info('Run completed: {}'.format(src_path)) def watch(path, extensions): logging.basicConfig( level=logging.INFO, filename='~/hoge.log', format='%(asctime)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S', ) event_handler = HogeHandler(extensions) observer = Observer() observer.schedule(event_handler, path, recursive=True) observer.start() try: while True: time.sleep(1) except KeyboardInterrupt: observer.stop() observer.join() if __name__ == '__main__': TARGET_PATH = '/var/tmp/' extensions = ['*js'] watch(TARGET_PATH, extensions)
実行権限
$ sudo chomd 0755 ~/hoge.py
スクリプトをデーモン化
/etc/systemd/system/hoge.service
ファイル作成
[Unit] Description=SFTP Sync Daemon [Service] User=istamp ExecStart=/usr/bin/python /var/www/istamp/bin/sftp_sync.py Restart=always Type=notify WatchdogSec=1 [Install] WantedBy=multi-user.target
systemctl で登録・自動起動・実行・確認
$ sudo systemctl daemon-reload $ sudo systemctl enable hoge.service $ sudo systemctl is-enabled hoge.service $ sudo systemctl start hoge.service $ sudo systemctl status hoge.service
動作確認
$ cd /var/tmp/ $ touch fuga.js $ tail ~/hoge.log
問題発生時は systemctl status
と sudo journalctl -xe
で確認
それから sudo reboot
で再起動して確認
自動起動を解除する場合
$ sudo systemctl disable hoge.service