Как написать cron, который будет запускать скрипт каждый день в полночь?

146

Я слышал, что crontab - хороший выбор, но как мне написать строку и где разместить ее на сервере?

Мэтт Элхотиби
источник

Ответы:

264

Вот хороший учебник о том, что такое crontab и как его использовать в Ubuntu. Ваша строка crontab будет выглядеть примерно так:

00 00 * * * ruby path/to/your/script.rb

( 00 00указывает на полночь - 0 минут и 0 часов - и *s означает каждый день каждого месяца.)

Синтаксис: 
  mm hh dd mt wd команда

  мм минут 0-59
  чч час 0-23
  дд день месяца 1-31
  mt месяц 1-12
  ср день недели 0-7 (воскресенье = 0 или 7)
  команда: что вы хотите запустить
  все числовые значения можно заменить на *, что означает все
Джордан Бег
источник
1
Не пропустите ли вы столбец «Запуск от имени пользователя»?
Лукас Кимон,
4
@LucasCimon Пользовательский столбец (который будет стоять перед командой) разрешен /etc/crontab(в Ubuntu), но при запуске crontab -eвы редактируете специфичный для пользователя crontab, который не позволяет использовать этот столбец. IIRC Ubuntu не рекомендует выходить /etc/crontabвручную, потому что он может быть перезаписан. См. Здесь: stackoverflow.com/questions/8475694/…
Jordan Running
@Jordan, так что ответ на crontab для rootsudo crotab -u root -e
dashesy
40

со страницы руководства

linux$ man -S 5 crontab

   cron(8) examines cron entries once every minute.

   The time and date fields are:

          field          allowed values
          -----          --------------
          minute         0-59
          hour           0-23
          day of month   1-31
          month          1-12 (or names, see below)
          day of week    0-7 (0 or 7 is Sun, or use names)
   ...
   # run five minutes after midnight, every day
   5 0 * * *       $HOME/bin/daily.job >> $HOME/tmp/out 2>&1
   ...

Следует отметить специальные «псевдонимы», которые можно использовать (задокументированные на странице руководства), в частности, «@reboot», для которого нет альтернативы времени и даты.

   # Run once after reboot.
   @reboot         /usr/local/sbin/run_only_once_after_reboot.sh

Вы также можете использовать этот трюк, чтобы запускать задание cron несколько раз в минуту.

   # Run every minute at 0, 20, and 40 second intervals
   * * * * *       sleep 00; /usr/local/sbin/run_3times_per_minute.sh
   * * * * *       sleep 20; /usr/local/sbin/run_3times_per_minute.sh
   * * * * *       sleep 40; /usr/local/sbin/run_3times_per_minute.sh

Чтобы добавить задание cron, вы можете сделать одно из трех:

  1. добавьте команду в crontab пользователя, как показано выше (и из crontab, раздел 5, страница руководства).

    • отредактируйте crontab пользователя как root с помощью crontab -e -u <username>
    • или отредактируйте crontab текущего пользователя, просто crontab -e
    • Вы можете установить редактор с EDITORпеременной окружения
      • env EDITOR=nano crontab -e -u <username>
      • или установите значение EDITOR для всего сеанса оболочки
        1. export EDITOR=vim
        2. crontab -e
    • Сделайте скрипты исполняемыми с помощью chmod a+x <file>


  1. создать сценарий / программу как задание cron и добавить его в системные /etc/cron.*lyкаталоги anacron

    • каталоги anacron /etc/cron.*ly:
      • /etc/cron.daily
      • /etc/cron.hourly
      • /etc/cron.monthly
      • /etc/cron.weekly
    • как в:
      • /etc/cron.daily/script_runs_daily.sh
      • chmod a+x /etc/cron.daily/script_runs_daily.sh - сделать его исполняемым
    • См. Также справочную страницу anacron: man anacron
    • Сделайте скрипты исполняемыми с помощью chmod a+x <file>
    • Когда запускаются эти cron. * Ly скрипты?
      • Для RHEL / CentOS 5.x они настроены /etc/crontabили /etc/anacrontabработают в заданное время.
      • Системы Linux RHEL / CentOS 6.x + и Fedora 17+ определяют это только в /etc/anacrontab, а cron.hourly - в/etc/cron.d/0hourly


  1. Или, можно создать системные crontables в /etc/cron.d.

    • Ранее описанный синтаксис crontab (с дополнительным предоставлением пользователю возможности выполнять каждое задание как) помещается в файл, и файл помещается в каталог /etc/cron.d.
    • Этим легко управлять в системной упаковке (например, в пакетах RPM), поэтому обычно они могут зависеть от конкретного приложения.
    • Разница в синтаксисе состоит в том, что пользователь должен быть указан для задания cron после полей времени / даты и до выполнения команды.
    • Добавленные файлы /etc/cron.dне обязательно должны быть исполняемыми.
    • Вот пример задания, которое выполняется от имени пользователя someuserи /bin/bashпринудительно используется в качестве оболочки.


   File: /etc/cron.d/myapp-cron
   # use /bin/bash to run commands, no matter what /etc/passwd says
   SHELL=/bin/bash
   # Execute a nightly (11:00pm) cron job to scrub application records
   00 23 * * * someuser /opt/myapp/bin/scrubrecords.php
Рассел Э. Глауэ
источник
5

Краткое руководство по настройке задания cron

Создайте новый текстовый файл, например: mycronjobs.txt

Для каждого ежедневного задания (00:00, 03:45) сохраните строки графика в mycronjobs.txt.

00 00 * * * ruby path/to/your/script.rb
45 03 * * * path/to/your/script2.sh

Отправьте задания в cron (каждый раз, когда вы запускаете это, cron удаляет то, что было сохранено, и обновляет новую информацию в mycronjobs.txt )

crontab mycronjobs.txt

Дополнительная полезная информация

Посмотреть текущие задания cron

crontab -l

Удалить все задания cron

crontab -r
Dyltini
источник
Ваш синтаксис crontab неверен для 03:45. В полях crontab указано «Минута», затем «Час», то есть «45 03» - в вашем сообщении оно указано наоборот.
Russell E Glaue
5

Иногда вам нужно указать PATH и GEM_PATH, используя crontab с rvm.

Как это:

# top of crontab file
PATH=/home/user_name/.rvm/gems/ruby-2.2.0/bin:/home/user_name/.rvm/gems/ruby-2.2.0@global/bin:/home/user_name/.rvm/rubies/ruby-2.2.$
GEM_PATH=/home/user_name/.rvm/gems/ruby-2.2.0:/home/user_name/.rvm/gems/ruby-2.2.0@global

# jobs
00 00 * * * ruby path/to/your/script.rb
00 */4 * * * ruby path/to/your/script2.rb
00 8,12,22 * * * ruby path/to/your/script3.rb
LV2014
источник
1

Вы можете выполнить сценарий оболочки двумя способами: либо с помощью задания cron, либо путем написания сценария оболочки.

Предположим, имя вашего скрипта - yourscript.sh.

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

ll script.sh

Если сценарий находится в корневом каталоге, используйте команду ниже

sudo crontab -e

Во-вторых, если сценарий содержит пользователя «ubuntu», используйте команду ниже

crontab -e

Добавьте в свой crontab следующую строку: -

55 23 * * * /path/to/yourscript.sh

Другой способ сделать это - написать сценарий и запустить его в фоновом режиме.

Вот сценарий, в котором вы должны указать имя сценария (например: - youscript.sh), который будет запускаться каждый день в 23:55.

#!/bin/bash while true do /home/modassir/yourscript.sh sleep 1d done

сохраните его в файл (назовем его "каждый день.sh")

sleep 1d - означает, что он ждет один день, а затем снова запускается.

теперь дайте разрешение вашему скрипту. используйте команду ниже: -

chmod + x every-day.sh

Теперь выполните этот сценарий оболочки в фоновом режиме с помощью «nohup». Это продолжит выполнение сценария даже после выхода из сеанса.

используйте команду ниже для выполнения скрипта.

nohup ./every-day.sh &

Примечание: - чтобы запускать "yourscript.sh" каждый день в 23:55, вы должны выполнять сценарий "every-day.sh" ровно в 23:55.

Модассир Хайдер
источник
0

Поместите это предложение в файл crontab: 0 0 * * * / usr / local / bin / python /opt/ByAccount.py> /var/log/cron.log 2> & 1

МАЭС
источник