Тема: [Рішення][owncloud] Як використати таймери systemd замість cron
Owncloud має свій cron, для того щоб він працював найкращим варіантом є запуск php скрипта кожні 15 хвилин за допомогою звичайного cron. Справа у тому, що зараз відбувається перехід на systemd, тому вирішив не чекати останньої миті та сам перейти без чужого підсрачника.
Спочатку треба створити скрипт запуску самого owncloud cron, бо існує проблема яка рідко але з'являється: owncloud cron достроково завершує роботу і не видаляє .lock файл, який не дає запускатися owncloud cron у наступний раз. Саме тому щоразу перевіряємо наявність та видаляємо вище згаданий файл. Скрипт елементарний:
#!/bin/bash
# Viktor Matvieienko <hetman.net@gmail.com>
SCRIPT=`basename "$0"`
PID=$$
CRON_PATH="/usr/share/owncloud/cron.php"
LOCK_PATH="/var/lib/owncloud/data/cron.lock"
if [ $USER = "apache" ];
then
logger -t "$SCRIPT[$PID]" "TIMER: start"
# Пошук файлу блокування одночасного запуску кількох екземплярів owncloud cron
find $LOCK_PATH -cmin +15 -delete 2> /dev/null
if [ $? -eq 0 ];
then
logger -t "$SCRIPT[$PID]" "TIMER: delete cron.lock"
fi
# Запуск файлу owncloud cron
logger -t "$SCRIPT[$PID]" "TIMER: run cron.php"
php -f $CRON_PATH
logger -t "$SCRIPT[$PID]" "TIMER: end"
exit 0
else
logger -t "$SCRIPT[$PID]" "TIMER: Error! No apache user"
exit 1
fi
logger тут щоб до /var/log/messages звітувати про те що все добре.
Для того щоб скрипт можна було запустити з systemd по timer треба створити .service файл в теці /etc/systemd/system, саме в ній, а не /usr/lib/systemd/system. Бо перша то для користувацьких налаштувань systemd, а друга для тих що з пакунку встановлюються.
Ось цей нескладний файл owncloud.service:
[Unit]
Description=Owncloud cron
Requires=httpd.service mariadb.service
After=httpd.service mariadb.service
[Service]
Type=oneshot
User=apache
Group=apache
ExecStart=/usr/local/bin/owncloud
ExecStart це шлях до запуску вище згаданого скрипта. Тепер треба лиш створити таймер для запуску цього сервісу, тобто owncloud.timer:
[Unit]
Description=Owncloud cron
[Timer]
OnStartupSec=15m
OnUnitActiveSec=15m
AccuracySec=15m
[Install]
WantedBy=multi-user.target
Якщо імена файлів сервісу і таймеру співпадають, то в таймері не треба вказувати ім'я сервісу.
Тепер три команди та можна насолоджуватися роботою:
# systemctl daemon-reload
# systemctl enable owncloud.timer
# systemctl start owncloud.timer
Та в логе бачимо таке:
cat /var/log/messages | grep owncloud | grep TIMER
Jan 8 14:39:41 localhost owncloud[10975]: TIMER: start
Jan 8 14:39:41 localhost owncloud[10975]: TIMER: run cron.php
Jan 8 14:39:41 localhost owncloud[10975]: TIMER: end
Як бачите працює, залишилося про всяк випадок перевірити у веб-інтерфейсі owncloud в адмініструванні чи збігається час з логу з останнім часом запуску owncloud cron, якщо так то все працює коректно і гна всі файли виставили коректні права і власників.