牌語備忘録 -pygo

あくまでもメモです。なるべくオフィシャルの情報を参照してください。

牌語備忘録 -pygo

特定のディレクトリを監視する Python スクリプトを Ubuntu の systemd でデーモン化するメモ

こんな感じでやった気がするメモ

環境

  • ubuntu16.40
  • python2.7

Install Python ライブラリ

pip install watchdog

スクリプト実行時に依存関係でエラーになる場合があるのでその都度必要なライブラリをインストール)

特定のディレクトリを監視する python スクリプト

ファイルが作成・変更された場合に _func() を実行

# 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 statussudo journalctl -xe で確認
それから sudo reboot で再起動して確認

自動起動を解除する場合

$ sudo systemctl disable hoge.service

参考