Як правильно налаштувати завдання root root


36

Я намагався налаштувати завдання root root, щоб запустити Bash-скрипт як root, запускати в хвилині 7,37, щогодини, щодня місяця, кожного місяця. Цей скрипт розміщений у /usr/binімені tunlrupdate.sh. Він оновлює DNS Tunlr.

$ ls -l /usr/bin/tunlrupdate.sh 
-rwxr-xr-x 1 root root 2133 Sep 24 15:42 /usr/bin/tunlrupdate.sh

Цей сценарій Bash доступний тут .

Після виклику сценарію записує те, що відбувається в журналі, що знаходиться в /var/log/tunlr.log

Щоб додати цю роботу з кореневим cron, я використав стандарт для crontab root

sudo crontab -e

І вставили ці 2 рядки в кінці. Я очікую, що cron запустить скрипт як root.

# check for updated Tunlr DNS every 30 minutes at the hour + 7 mn and hour + 37 mn
07,37 * * * * root /usr/bin/tunlrupdate.sh

Пізніша команда sudo crontab -lпідтвердила, що завдання cron було вставлено.

Я перезавантажив Ubuntu і перевіряв у файлі журналу, чи завдання Cron було запущено належним чином. Однак у лог-файлі немає нічого, що /var/log/tunlr.logозначає, що завдання ніколи не було успішно запущено.

Я перевірив, чи запускаю скрипт із командного рядка

sudo /usr/bin/tunlrupdate.sh

тоді файл журналу оновлюється відповідно.

Чому ця робота з хронів не працює так, як планувалося в моїй системі?

ОНОВЛЕННЯ 1: Усі запропоновані рішення поки що не спрацьовують. Дякую Оллі за CLI, який перелічив системний журнал sudo grep CRON /var/log/syslog. Однак я отримав помилку CRON

CRON[13092]: (root) CMD (  [ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ]
&& find /var/lib/php5/ -depth -mindepth 1 -maxdepth 1 -type f -cmin +$(/usr/lib/php
/maxlifetime) ! -execdir fuser -s {} 2>/dev/null \; -delete)

із запропонованим PATH = вставкою та використанням абсолютного шляху від root для функцій у сценарії або без цього запропонованого рішення тут. Я все одно отримую цю помилку.

Після деякого пошуку я визначив помилку у файлі, /usr/lib/php5/maxlifetimeяк це пояснено тут :Change #!/bin/sh -e --> #!/bin/sh -x

Потім перерахування журналу помилок CRON у моїй системі

sudo grep CRON /var/log/syslog
Feb 11 18:07:01 Marius-PC CRON[14067]: (root) CMD (root /usr/bin/tunlrupdate.sh)
Feb 11 18:07:01 Marius-PC CRON[14066]: (root) MAIL (mailed 1 byte of output; but got
status 0x00ff, #012)

Я досі не отримую сценарій bash. Цього разу у журналі не відображається помилок. Щоб переконатися, що це не зміст сценарію, я зменшив сценарій до наступних 3 рядків:

#!/bin/bash
LOGFILE=/var/log/tunlr.log
echo $LOGFILE >> $LOGFILE

Я до сих пір не отримую роботу з кроном. У файлі журналу нічого не записано. Так навіть пустий сценарій не буде працювати в cron? Я не розумію. Мені відомо, що спробую сценарій, зведений до цих двох рядків:

#!/bin/bash
exit 0

І все той же журнал помилок. Сценарій cron не проходить ...


Якщо ви хочете, щоб це було "кореневим" кронібом, ви повинні мати корінь, тоді ви вводите crontab -e. Також потрібно просто увійти як root (тип консолі "su root"), а потім crontab -e (sudo в цьому випадку не потрібен).
Вольфганг

Добре. Я не бачу сенсу вашої відповіді? Введення $ sudo crontab -e виконало роботу так, як повідомляється $ sudo crontab -l, тобто рядок, що описує нове завдання, додано до кореня кореня. Як правило, завдання немає в кроні користувача, наприклад, $ crontab -l не показує, що тут додано жодне завдання cron.
Антоніо

@WolfgangVogl він використав "судо", яке працює як слід.
Алексіс Вільке

Відповіді:


68

Якщо ви хочете запустити сценарій як звичайний користувач :

crontab -e

І додайте рядок:

07,37 * * * * /usr/bin/tunlrupdate.sh

Якщо ви хочете запустити свій скрипт як root :

sudo crontab -e

І додайте той самий рядок:

07,37 * * * * /usr/bin/tunlrupdate.sh

@NineCattoRules Якщо ви не відмовляєтесь від результатів, що ви бачите?
Анджело Фукс

Старий коментар @AngeloFuchs ... безумовно, я спробував цю команду як root ( sudo crontab -eзамість crontab -e). Або щось інше, все одно це працює
NineCattoRules

10

Ну і нарешті робоче рішення. У системі я побачив повторювані та інтригуючі:

CRON[18770]: (root) CMD (root /usr/bin/tunlrupdate.sh)

Це звучить як root не було розпізнано як cmd. Як я вже використовував крон кореня, використовуючи $ sudo /usr/bin/tunlrupdate.sh. Потім я спробував з оригінальним сценарієм (виправлено помилку в даті UNIX cmd:% m, який використовується місяць, для хвилин, що становить% M), наступне (яке видаляє корінь з лінії cron):

$ sudo crontab -e
# check for updated Tunlr DNS every 30 minutes at the hour + 7 mn and hour + 37 mn
07,37 * * * * /usr/bin/tunlrupdate.sh

Це виявилося остаточним рішенням. [Хоча я знайшов десятки літератури, в яких зазначається помилкова лінія з коренем у лінії кронів. Це була помилка].


Добрий момент Оллі. Я з цим згоден. Для довідки, crontab користувача зберігається у / var / spool / cron / crontabs / ім'я користувача або для root / var / spool / cron / crontabs / root. Дивіться цю сторінку askubuntu.com/questions/216692/where-is-the-user-crontab-stored Папка, що містить, вже є і дає ім'я користувача.
Антоніо

Ну, тобі ця інформація не потрібна, оскільки ти повинен редагувати лише файли crontab за допомогою crontabкоманди (крім файлів crontab в розділі /etc).
Оллі

1
@ Антоніо бали з полем імені користувача використовуються лише у /etc/crontab(загальносистемному кронтабі). Використовуючи sudo crontab -eви працюєте з /var/spool/cron/crontabs
кронтабом

2

Однією з "проблем" із cron є відсутність змінних середовищ (з очевидних причин безпеки). Ймовірно, вам не вистачає PATH та HOME Ви можете визначити їх у сценарії безпосередньо або у файлі crontab.

# check for updated Tunlr DNS every 30 minutes at the hour + 7 mn and hour + 37 mn
PATH=/usr/bin
07,37 * * * * root /usr/bin/tunlrupdate.sh

Вам доведеться перевірити, поки всі необхідні змінні не будуть визначені відповідно до сценарію.


1
Це єдина відповідь тут, яка насправді працювала на мене. Я скопіював з /etc/crontabфайлу операції SHELL і PATH і вставив їх у файл, і sudo crontab -eкоманда без проблем запустилася як root. Дякую!
Терранс

0

Повідомлення про помилки Cron, як правило, надсилаються електронною поштою. Ви можете перевірити, чи є електронна пошта для root sudo mailабо, просто перевіривши вміст /var/mail/root, наприклад sudo less /var/mail/root.


Якщо повідомлення електронної пошти не допомагає, також перевірте /var/log/syslog:

sudo grep CRON /var/log/syslog

Як уже сказав Алексіс Вілке, у cron є різний механізм встановлення змінних середовища.

Ваш сценарій потребує

PATH=/sbin:/bin:/usr/bin

до кронтабу. HOMEне повинно бути необхідним. Ви повинні використовувати абсолютні шляхи у своїх сценаріях, наприклад, /bin/dateзамість date. Ви можете знайти належні шляхи для кожної команди за допомогою which command_name, напр

$ which date
/bin/date

Запустивши запропонований греп CRON в / var / log / syslog, я отримав наступне повідомлення 11 лютого 14:37:01 Marius-PC CRON [7826]: (root) CMD (root /usr/bin/tunlrupdate.sh) 11 лютого 14: 37:01 Marius-PC CRON [7825]: (root) MAIL (надіслано 1 байт виводу; але він отримав статус 0x00ff, # 012) 11 лютого 14:39:01 Marius-PC CRON [7849]: (root) CMD ( [-x / usr / lib / php5 / maxlifetime] && [-d / var / lib / php5] && find / var / lib / php5 / -depth -mindepth 1 -maxdepth 1 -тип f -cmin + $ (/ usr / lib / php5 / maxlifetime)! -execdir fuser -s {} 2> / dev / null \; -delete) Якщо я додаю певне визначення для PATH в cron, це не вплине на мою систему $ PATH?
Антоніо

Цей висновок говорить, що він намагався щось надіслати електронною поштою, але не вдався. Це означає, що ви не отримуєте повідомлення про помилку /var/mail/root. Ви можете це виправити, або спробуватиPATH=...
Оллі,

@Antonio, альтернативно, використовуйте цю виправлену версію
Olli

Спасибі. Я знаю, що не налаштовував системну електронну пошту і знав, що не пройшов. Я вже змінив сценарій, щоб використовувати абсолютний шлях для будь-якої функції, що називається. Останнє, що було в моєму попередньому питанні, визначення PATH в crontab не зіпсує мій системний змінний $ PATH?
Антоніо

1
Тим часом я був зайнятий виправленням помилки у форматі дати з оригінального сценарію. Він використовував% m (що за місяць НЕ хвилини) замість% M ...
Антоніо

0

Ви можете додати цей рядок у свій сценарій. Тож після того, як ви перевірите журнали cron та спростуєте свою роботу, ви зможете отримати той самий $ PATH, який мав crontabs.

/bin/echo $PATH > /root/path.txt

І, мабуть, найкраще, що ви можете зробити для діагностики проблем у сценаріях cron - це отримати всі змінні середовища SO із командою env у вашому сценарії. Тому просто додайте цей рядок до свого сценарію. Потім можна проаналізувати вихідallEvnVars.txt

/usr/bin/env > /root/allEvnVars.txt

Ще одна хитрість - направити вихід сценарію на якесь місце. Додавання /root/log.log. Таким чином буде підтримуватися весь вихід сценарію/root/log.log

07,37 * * * * root /usr/bin/tunlrupdate.sh  > /root/log.log

Також ви можете запланувати запуск сценарію на кожну хв для полегшення тестів та перевірок.

*/1 * * * * root /usr/bin/tunlrupdate.sh  > /root/log.log
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.