crontab's @reboot працює лише для root?


64

man 5 crontab досить зрозуміло, як використовувати crontab для запуску сценарію під час завантаження:

   These special time specification "nicknames" are supported, which replace the 5 initial time and date
   fields, and are prefixed by the `@` character:
   @reboot    :    Run once after reboot.

Тож я із задоволенням додав один рядок до мого crontab (під моїм обліковим записом користувача, а не root):

@reboot     /home/me/myscript.sh

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

Що я пропускаю?


Оновіть відповіді на запитання @ Антона:

  1. Версія Oracle-linux: 5.8 (унме: 2.6.32-300.39.2.el5uek №1 SMP)
  2. Версія Cron: vixie-cron-4.1-81.el5.x86_64
  3. Так, /home це змонтована перегородка. Схоже, це проблема. Як мені це вирішити?
  4. Наразі myscript.shтекстове повідомлення перегукується лише з файлом у /home/me.

2
ваш користувальницький crontab не підтримує параметр @reboot, після декількох макетів crontab ви знайдете декілька макетів, як тільки ви почнете ковтати.
X Тянь

@XTian Дякую Який рекомендований спосіб запустити скрипт при перезавантаженні як користувач, відмінний від root?
Затримано

2
Те, що вам не вистачає, незрозуміло, але те, що нам бракує, - це деталі. Яку версію oracle-linux ви працюєте? Яку версію cron у вас є? Чи /homeзмонтована перегородка? Який вміст вашого /home/me/myscript.sh?
Антон

1
Якщо ви використовуєте Лінь Oracle. вер. 5 є цей журнал змін щодо проблем з vixie-cron + @reboot. oss.oracle.com/pipermail/el-errata/2012-March/002655.html
slm

1
@Daniel - myscript.shвиконується? chmod +x myscript.sh.
slm

Відповіді:


47

Це може бути трохи заплутаною темою, оскільки існують різні реалізації cron. Також було кілька помилок, які порушили цю функцію, а також є деякі випадки використання, коли вона просто не працюватиме, зокрема, якщо ви робите вимкнення / завантаження проти перезавантаження.

Клопи

точка даних №1

Один з таких помилок у Debian висвітлюється тут під назвою: cron: @reboot завдання не виконуються . Здається, це також зробило шлях до Ubuntu, що я не можу підтвердити безпосередньо.

точка даних №2

Докази помилки в Ubuntu, здавалося б, підтверджені тут, у цьому запитанні SO& W під назвою: @reboot cronjob не виконується .

витяг

коментар №1: .... 3) Ваша версія crond може не підтримувати @reboot чи використовуєте Ви вікс? ... показати результати користувача crontab -l -u

коментар №2: ... Можливо, було б гарною ідеєю встановити його як сценарій init, а не спиратися на певну версію @reboot cron.

коментар №3: ... @MarkRoberts видалив перезавантаження та змінив 1 * * * *, на * / 1 * * * *, проблема вирішена! Куди надсилати позначку представника? Дякую!

У цьому питанні прийнята відповідь також була в цьому коментарі:

Мені здається, Lubuntu не підтримує синтаксис @Reboot Cron.

Додаткові докази

точка даних №3

В якості додаткового доказу з'явилася ця тематика, що хтось намагався зробити те саме, що засмучується, що це не працює. Він має назву: Thread: Cron - @reboot робота не працює .

витяг

Re: Cron - @reboot завдання не працюють

Цитата Повідомлення від ceallred Переглянути повідомлення Це вбиває мене ... Спробував обгортковий сценарій. Запуск вручну генерує файл журналу ... перезавантаження і завдання не запускається або створюється файл журналу.

Syslog показує, що CRON виконував завдання ... але знову ж таки, немає результатів і процес не працює. 15 липня 20:07:45 RavenWing cron [1026]: (CRON) INFO (Запуск завдань @reboot) 15 липня 20:07:45 RavenWing CRON [1053]: (прихований) CMD (/ home / ceallred / Scripts / run_spideroak. sh> /home/ceallred/Scripts/SpiderOak.log 2> & 1 &)

Здається, що cron не любить команду @reboot .... Будь-які інші ідеї?

Гаразд ... Частково вирішено. Я позначу це як вирішене і розпочну нову тему з новим питанням .....

Я думаю, що відповідь полягала в тому, що мій зашифрований домашній каталог не був змонтований, коли CRON намагався запустити сценарій (зберігається в / home / username / script). Переміщено до / usr / скриптів і робота працює як очікувалося.

Тож зараз, мабуть, йдеться про проблему з павуком. Процес починається, але до моменту закінчення процесу завантаження він пройшов. Я здогадуюсь краху чомусь .... Нова тема для запитання про це.

Дякую за всю допомогу!

Як тільки цей вище користувач розібрався у своїй проблемі, він зміг @rebootрозробитись із записом користувача на кронтабі.

Я не зовсім впевнений, яка версія cron використовується на Ubuntu, але це, мабуть, вказує на те, що користувач також може використовувати @rebootабо що помилка була виправлена ​​в якийсь момент у наступних версіях cron.

точка даних №4

Я тестував на CentOS 6 наступне, і це спрацювало.

Приклад

$ crontab -l
@reboot echo "hi" > /home/sam/reboot.txt 2>&1

Потім я перезавантажив систему.

$ sudo reboot

Після перезавантаження.

$ cat reboot.txt 
hi

Відволікайте

  1. Ця функція, мабуть, підтримується як для системних, так і для записів користувачів на кроні.
  2. Ви повинні переконатися, що він підтримується / працює у вашому конкретному дистрибутиві та / або версії пакету cron.

Детальніше про те, як працює власне механізм, @rebootя натрапив на цю публікацію в блозі, в якій обговорюються внутрішні. Це під назвою: @reboot - пояснення простої магії хронів .

Налагодження крони

Ви можете збільшити багатослівність crond, додавши наступне до цього файлу конфігурації у дистрибутивах на основі RHEL / CentOS / Fedora.

$ more crond 
# Settings for the CRON daemon.
# CRONDARGS= :  any extra command-line startup arguments for crond
CRONDARGS="-L 2"

Дійсні рівні дорівнюють 0, 1 або 2. Щоб повернути цей файл до його рівня реєстрації за замовчуванням, просто видаліть, "-L 2"коли ви закінчите налагодження ситуації.


Вчора отримав коментар , подивився на вашу відповідь і вирішив відповісти собі після доброго нічного сну. Налаштуйте VM, повторивши @reboot, хотів опублікувати мою відповідь, і лише тоді побачив, що ви "переробили" свою відповідь :-(
Антон

@Anthon - вибачте, я вчора швидко відповів на нього, а потім продовжував його досліджувати і знайшов дуже суперечливі деталі. Коли я виявив помилку на Debian про це та Ubuntu SO, я зрозумів, що було в грі. Я побачив, що він працює на CentOS, і склав це, що @rebootдобре в певних кронах, і, очевидно, помилка / зламаність в інших. Звідси плутанина.
slm

Крім того, що ОП надає мало деталей, ви можете легко використовувати те, що ще не працює (під час завантаження) у вашому сценарії, що робить його невдалим або розміщувати його на ще не встановленому диску. Мою відповідь, яку прокоментувала ОП, також була підтверджена третьою стороною. Це проблема чорного лебедя ...
Антон

@Anthon - так, одна з моїх точок даних була саме такою. @rebootспрацювало, як тільки ви зрозуміли, що намагається отримати доступ до зашифрованого диска, який ще не був змонтований.
slm

3
Ви можете вказати, що помилка в Ubuntu легко вирішується шляхом додавання затримки: @reboot sleep 60; <your command>. Цитуючи тему, "я здогадуюсь, що директива @reboot cron працює надто рано в процесі завантаження"
pzkpfw

12

Я дізнався, що на моїй машині Ubuntu я ще не маю доступу до служб dns, але в час @reboot. Це заважало мені встановлювати віддалені томи. Це банальне, але просте рішення спрацювало:

@reboot sleep 60 && /home/me/bin/mount.sh 2>&1 >> /home/me/reboot.log

(у root cron; останні частини лише для налагодження)


Це єдине, що насправді працює на ubuntu 16.04 для не-root користувачів!
Олександр Павич

Не працює над jessie Debian 8 (gnome 3). :(
Тадей

Це працювало для мене, коли я мав справу з монтажем спільних папок VMWare в окреме місце.
jgshawkey

3

У мене є Mac OSX, і у мене була така сама проблема, де мій сценарій не виконувався. але коли я виправив свій сценарій, щоб подобатися

@reboot   cd /home/me/  && sh myscript.sh

це добре працювало для мене. переконайтеся, що переконайтеся, що ваш файл оболонки виконується, виконавши команду

chmod +x myscript.sh

2

Я не знаю, чи ви вже вирішили це, чи рішення потрібне вам було вище, але інша можливість:

якщо у вас / ваш домашній каталог зашифрований, він може бути недоступним до входу, тобто він недоступний при перезавантаженні.

у цьому випадку ви можете перемістити сценарії в інше місце, наприклад / srv або / opt або / usr / local / bin / тощо.


1

Візьміть нову установку Ubuntu Gnome 13.10 (у моєму випадку користувач за замовчуванням: avanderneut).

avanderneut@uggo:~$ crontab -l
no crontab for avanderneut
avanderneut@uggo:~$ crontab -e
no crontab for avanderneut - using an empty one

Select an editor.  To change later, run 'select-editor'.
  1. /bin/ed
  2. /bin/nano        <---- easiest
  3. /usr/bin/vim.tiny

Choose 1-3 [2]: 3
crontab: installing new crontab
avanderneut@uggo:~$ crontab -l | tail -2
# m h  dom mon dow   command
@reboot /home/avanderneut/bin/on_reboot
avanderneut@uggo:~$ vi /home/avanderneut/bin/on_reboot
avanderneut@uggo:~$ more !$
more /home/avanderneut/bin/on_reboot
#! /bin/bash
echo "Reboot script" > /var/tmp/xxx
avanderneut@uggo:~$ chmod 755 /home/avanderneut/bin/on_reboot
avanderneut@uggo:~$ ls /var/tmp
avanderneut@uggo:~$ /home/avanderneut/bin/on_reboot
avanderneut@uggo:~$ ls /var/tmp
xxx
avanderneut@uggo:~$ rm /var/tmp/xxx
avanderneut@uggo:~$ sudo reboot
[sudo] password for avanderneut: 

І дивіться, що після перезавантаження файл /var/tmp/xxxє там, хоча його ще не було до перезавантаження.

Це було зроблено з версією cron 3.0.

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

Можливо, вам знадобиться більш сучасний крон (або оновлення від Oracle-linux), якщо це не працювало для вас і вам потрібна ця функція.


Я оновив свою ОП, щоб відповісти на ваші запитання. Виявляється, ваша підозра була з самого початку: Сценарій, який потрібно запустити при перезавантаженні, знаходиться на встановленому /dev/mapper/VolGroup00-LogVol01розділі.
Затримано

@Daniel Дякую за те, що повідомили мені, я радий, що ви знайшли винуватця. Я не впевнений, чи зможете ви затримати початок крону до монтажу розділів, частина цього запуску робиться паралельно, і вам доведеться змінити залежності. Я б не хотів возитися з тим і можливим перервою cron. Вам слід IMHO пройти інший маршрут, ніж crontab & @reboot, щоб щось запустити один раз при запуску як користувач.
Антон

0

Я б сказав "так" на запитання. Просто виникли труднощі із запуском cron при перезавантаженні (Debian 3.10.70) і вдалося вирішити:

@reboot root /usr/bin/python3 /path/to/script

І зрештою символ \ n ' нового рядка

Це вміст файлу:

/etc/cron.d/runOnReboot

Нарешті, я думаю, що варто відзначити конспект з man 5 crontab

... Формат команди cron - це майже стандарт V7, з кількома розширеннями, сумісними вгору. У кожному рядку є п’ять полів часу та дати, після яких - команда, а потім символ нового рядка ('\ n'). Система crontab (/ etc / crontab) використовує той самий формат, за винятком того, що ім'я користувача для команди вказано після полів часу та дати та перед командою. Поля можуть бути розділені пробілами або вкладками. Максимально допустима довжина для командного поля - 998 символів. ...


0

Перш за все, ви повинні увійти як root:

судо -і

Потім відкрийте crontab:

кронтаб -е

Після цього додайте свій скрипт у crontab як root, як показано нижче:

@reboot root / home / user1 / Desktop / my_script

В результаті я побачив, що мій сценарій працює правильно.

Примітка. Якщо ви редагуєте crontab з вашим поточним користувачем, перезавантаження не може правильно зателефонувати вашому сценарію.


-1

прубе:

usuario @ ubuntu: ~ $ touch script.sh usuario @ ubuntu: ~ $ chmod + x script.sh

usuario @ ubuntu: ~ $ $ crontrab -e

@reboot /home/usuario/script.sh

зберегти та перезапустити ПК

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