1 Востаннє редагувалося HetmanNet (09.01.2016 18:01:09)

Тема: [Рішення][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, а друга для тих що з пакунку встановлюються.

Застереження

Якщо вам треба відредагувати файл service, timer і т.п. встановлений з пакунку, то просто скопіюйте необхідний файл в теку користувацьких налаштувань та відредагуйте. Оригінальний файл не треба видаляти, редагувати, перейменовувати, 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, якщо так то все працює коректно і гна всі файли виставили коректні права і власників.


Дякую за увагу.

Дану інструкцію написав з використанням керівництва systemd, bash, як додати в cron запуск cron owncloud та опис баґу з .lock файлом в cron owncloud.
Певний час працює на сервері без проблем. Наступні модифікації викладу як зроблю.
Ця інструкція опублікована вперше, тобто replace.org.ua перший ресурс де є опис як замінити cron на systemd для owncloud. Перед тим як робити шукав, на момент пошуків подібної не знайшов, всі юзають старий добрий cron.

Подякували: Master_Sergius, leofun01, Анатолій3

2

Re: [Рішення][owncloud] Як використати таймери systemd замість cron

Ну, по-перше, ми дізналися, що Ви - Віктор Матвієнко.
По-друге, суть переходу - це відмова від крона чи як зрозуміти? Бо інакше не дуже зрозуміло сенс такої праці, але було цікаво, тому - дякую.

3 Востаннє редагувалося HetmanNet (09.01.2016 00:25:17)

Re: [Рішення][owncloud] Як використати таймери systemd замість cron

Master_Sergius написав:

Ну, по-перше, ми дізналися, що Ви - Віктор Матвієнко.
По-друге, суть переходу - це відмова від крона чи як зрозуміти? Бо інакше не дуже зрозуміло сенс такої праці, але було цікаво, тому - дякую.

Взагалі Матвєєнко, хоча це можна дізнатися якщо вбити HetmanNet в Google  :[
Суть в тому, що можна вимикати (і вмикати) таймери в systemd без видалення (чи переміщення, перейменування і т.д.) самий файлів таймерів просто командою:

# systemctl disable owncloud.timer

Також в systemd легше вказати процеси під час роботи яких можна виконувати таймер:

Requires=httpd.service mariadb.service
After=httpd.service mariadb.service

Також можна з легкістю вказати один раз групу та користувача від якого виконувати, а не згадувати від кого має працювати скрипт коли додаєш в cron:

User=apache
Group=apache

Також мені не суттєво на якій стадії завантаження cron, бо просто вказую на якій має працювати таймер:

WantedBy=multi-user.target

Можна вказати просто запуск скрипту не раніше ніж за 15 хвилин після запуску системи, та вказати інтервал запуску відносно останнього запуску, а не так як в cron конкретний час який може збігтися з небажаними процесами:

OnStartupSec=15m
OnUnitActiveSec=15m

Також можу вказати через скільки часу вбити процес після запуску якщо сам не завершиться без написання складних скриптів по відстеженню самого скрипту і його дочірніх процесів, за мене це зробить systemd:

AccuracySec=15m

Така незначна кількість строк в налаштуваннях замінили ті сотні строк що були раніше у скрипту.  *HI*

Подякували: Master_Sergius, leofun012

4

Re: [Рішення][owncloud] Як використати таймери systemd замість cron

Ну, гуглиться (навіть ДакДакГо-иться) на раз - https://solpeth.wordpress.com/2013/12/2 … placement/

І все ж, старий добрий крон нікуди не дінеться, хоча би через те, що ним можна задавати конкретний час, а не лише постійні проміжки (по типу раз в 15 хв). А по-друге - кроном править один демон, а не новий сервіс під кожен такий кроно-замінник. Але все одно, дякую.

Подякували: leofun011

5 Востаннє редагувалося HetmanNet (09.01.2016 01:27:46)

Re: [Рішення][owncloud] Як використати таймери systemd замість cron

Master_Sergius написав:

Ну, гуглиться (навіть ДакДакГо-иться) на раз - https://solpeth.wordpress.com/2013/12/2 … placement/

І все ж, старий добрий крон нікуди не дінеться, хоча би через те, що ним можна задавати конкретний час, а не лише постійні проміжки (по типу раз в 15 хв). А по-друге - кроном править один демон, а не новий сервіс під кожен такий кроно-замінник. Але все одно, дякую.

В systemd можна задати конкретний конкретну хвилину, годину, день тижня, день місяця, місяць і навіть рік. Тож cron тут теж програє, бо обмежується днем місяця. Systemd є одним єдиним, навіть демон cron зараз запускається за допомогою systemd.
Крім того система таймер що запускає сервіс є зручнішою, бо наприклад можу створити два різних таймера для одного сервісу, і т.п. Також можу запустити один таймер кілька раз з різними параметрами, які передадуть скрипту чи демону що запускає сервіс (якщо в ньому це передбачити), подібну річ можливо згодом продемонструю.
Крім того механізм перенесення налаштувань зручніший, скопіював кілька файлів і все. З моменту як взявся за вивчення systemd, зрозумів що він може куди більше ніж всі його попередники і вирішує багато проблем кількома строками. Одним словом systend не такий страшний як здається, спочатку теж вважав що це незручно, поки не освоїв хоча би базові найбільш розповсюджені можливості systemd. Тепер купа планів, щодо того що перенести на systemd.

Щодо посилання то подібного купу бачив, але лиш в документації є все, ця за посиланням навіть не дає інформації про найбільш часто вживані опції таймерів, тому придатною важко назвати. Але навіть якщо визнати придатною, там не про застосування на прикладі owncloud. Саме про це казав у кінці першого посту, що немає інформації як перевести owncloud cron на systemd, тому не псуйте ексклюзивність статей для форуму replace.org.ua.  :-X