@reboot crontab работает только для root?

65

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 не запускается при перезагрузке компьютера. (он работает нормально, если я вызываю его из командной строки, поэтому это не проблема с разрешениями)

Чего мне не хватает?


Обновление, чтобы ответить на вопросы @ Anthon:

  1. Версия Oracle-linux: 5.8 (uname: 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.
Withheld
источник
2
Ваш пользователь crontab не поддерживает опцию @reboot, есть несколько макетов crontab, как только вы начинаете возиться.
X Тянь
@XTian Спасибо. Каков рекомендуемый способ запуска сценария при перезагрузке от имени пользователя, отличного от пользователя root?
Удержано
2
То, чего вам не хватает, неясно, но нам не хватает деталей. Какую версию oracle-linux вы используете? Какая версия cron у вас есть? Это /homeсмонтированный раздел? Какое содержание у вас /home/me/myscript.sh?
Anthon
1
Если вы используете Oracle's Lin. веры. 5 есть этот список изменений о проблемах с vixie-cron + @reboot. oss.oracle.com/pipermail/el-errata/2012-March/002655.html
ОДС
1
@Daniel - это myscript.shисполняемый файл? chmod +x myscript.sh,
SLM

Ответы:

48

Это может быть немного запутанной темой, потому что существуют разные реализации cron. Также было несколько ошибок, которые нарушали эту функцию, и есть также некоторые случаи использования, когда она просто не будет работать, особенно если вы выполняете выключение / загрузку вместо перезагрузки.

ошибки

дата № 1

Здесь описана одна такая ошибка в Debian под названием: cron: @reboot задания не выполняются . Похоже, это пробило себя и в Ubuntu, что я не могу подтвердить напрямую

дата № 2

Доказательство ошибки в Ubuntu, похоже, подтверждается здесь в этом SO Q & A под названием: @reboot cronjob не выполняется .

выдержка

комментарий №1: .... 3) ваша версия crond может не поддерживать @reboot вы используете vron's crond? ... показать результаты пользователя crontab -l -u

комментарий № 2: ... Возможно, было бы неплохо установить его в качестве сценария инициализации, а не полагаться на конкретную версию @reboot cron.

комментарий № 3: ... @MarkRoberts удалил перезагрузку и изменил 1 * * * *, чтобы * / 1 * * * *, проблема решена! Куда мне отправлять респ птс марки? Спасибо!

Принятый ответ в этом Q & A также имел этот комментарий:

Мне кажется, Lubuntu не поддерживает синтаксис @Reboot Cron.

Дополнительные доказательства

дата № 3

В качестве дополнительного доказательства была эта тема, что кто-то пытался сделать то же самое и разочаровывался, что это не сработало Это называется: Тема: Cron - задания @reboot не работают .

выдержка

Re: Cron - задания @reboot не работают

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

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

Кажется, что cron не нравится команда @reboot .... Есть еще идеи?

Хорошо ... Частично решено. Я отмечу это как решенное и начну новую тему с новой проблемой .....

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

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

Спасибо за помощь!

Как только этот пользователь выяснил свою проблему, он смог @rebootработать с записью crontab пользователя.

Я не совсем уверен, какая версия 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. Эта функция поддерживается как для системных, так и для пользовательских записей crontab.
  2. Вы должны убедиться, что он поддерживается / работает в вашем конкретном дистрибутиве и / или версии пакета cron.

Чтобы узнать больше о том, как работает настоящий механизм, @rebootя наткнулся на этот пост в блоге, в котором обсуждаются внутренности. Он называется: @reboot - объясняет простую магию крона .

Отладка crond

Вы можете увеличить детализацию 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"когда закончите отладку ситуации.

SLM
источник
Получил комментарий вчера, посмотрел на ваш ответ и решил сам ответить после хорошего ночного сна. Настроил виртуальную машину, повторил попытку @reboot, захотел опубликовать мой ответ и только потом увидел, что вы «перефразировали» свой ответ :-(
Anthon
@Anthon - извините, я быстро ответил на это вчера, а затем продолжил исследовать его и нашел очень противоречивые детали. Когда я обнаружил ошибку в Debian и Ubuntu SO, я понял кое-что из того, что было в игре. Я увидел, что он работает на CentOS, и собрал его, что @rebootнормально в некоторых кронах, и, очевидно, глючит / сломан в других. Отсюда и путаница.
SLM
Кроме того, OP предоставляет мало деталей, вы можете легко использовать что-то, что еще не работает (во время загрузки) в вашем скрипте, что приводит к сбою или находится на еще не смонтированном диске. Мой ответ, который прокомментировал ФП, был также подтвержден третьей стороной. Это проблема черного лебедя ...
Anthon
@Anthon - да, одна из моих точек данных была именно такой. @rebootсработало, как только вы поняли, что оно пытается получить доступ к зашифрованному диску, который еще не был подключен.
SLM
3
Вы можете указать, что ошибка в Ubuntu легко решается путем добавления задержки: @reboot sleep 60; <your command>. Процитирую тему: «Я предполагаю, что директива cron @reboot запускается слишком рано в процессе загрузки»
pzkpfw
12

Я обнаружил, что на моей машине с Ubuntu у меня нет доступа к службам dns, но во время @reboot. Это помешало мне подключить удаленные тома. Это банальное, но простое решение сработало:

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

(в корне cron; последние части только для отладки)

Андре
источник
Это единственное, что действительно работает на Ubuntu 16.04 для пользователей без полномочий root!
Александар Павич
Не работает на Debian 8 Джесси (гном 3). :(
Тадей
Это сработало для меня при установке общих папок VMWare в отдельном месте.
jgshawkey
3

У меня есть Mac OSX, и у меня была та же проблема, где мой скрипт не работал. но когда я исправил свой сценарий как

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

это работало хорошо для меня. убедитесь, что ваш файл оболочки является исполняемым, выполнив команду

chmod +x myscript.sh
Кидане
источник
2

Я не знаю, если вы уже решили это, или если какой-либо из вышеперечисленных был решением, которое вам нужно, но другая возможность:

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

в этом сценарии вы можете переместить свои скрипты в другое место, например / srv или / opt или / usr / local / bin / и т. д.

FBAS
источник
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.

Вы должны убедиться, что не используются служебные диски и т. Д., Которые могут быть недоступны во время выполнения сценария. Начните с чего-то простого, подобного описанному выше, и убедитесь, что у него нет вывода терминала, поскольку электронная почта, вероятно, не работает.

Вам также может потребоваться более современный cron (или обновление с oracle-linux), если это не сработало и вам нужна эта функция.

Энтон
источник
Я обновил свой ОП, чтобы ответить на ваши вопросы. Оказывается, ваше подозрение было правильным с самого начала: скрипт для запуска при перезагрузке находится в монтируемом /dev/mapper/VolGroup00-LogVol01разделе.
Удержан
@Daniel Спасибо, что сообщили мне, я рада, что вы нашли виновника. Я не уверен, что вы можете отложить запуск cron до тех пор, пока разделы не будут смонтированы, часть этого запуска выполняется параллельно, и вам придется менять зависимости. Я не хотел бы связываться с этим и возможным разрывом cron. ИМХО, вы должны выбрать другой путь, чем 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 символов. ...

dmytro.poliarush
источник
0

Прежде всего, вы должны войти в систему как root:

судо

Затем откройте crontab:

crontab -e

После этого добавьте ваш скрипт в crontab как root, как показано ниже:

@reboot root / home / user1 / Desktop / my_script

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

Примечание: если вы редактируете crontab с вашим текущим пользователем, перезагрузка не сможет правильно вызвать ваш скрипт.

Мустафа Кемаль
источник
-1

Prueba:

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

usuario @ ubuntu: ~ $ $ crontrab -e

@reboot /home/usuario/script.sh

сохранить и перезагрузить компьютер

GNUman
источник