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

121

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

Теги:
cron

5 ответов

233
Лучший ответ

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

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

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

Syntax: 
  mm hh dd mt wd  command

  mm minute 0-59
  hh hour 0-23
  dd day of month 1-31
  mt month 1-12
  wd day of week 0-7 (Sunday = 0 or 7)
  command: what you want to run
  all numeric values can be replaced by * which means all
  • 1
    Вы не пропустите колонку «запустить как пользователь»?
  • 3
    @LucasCimon Пользовательский столбец (который должен идти перед командой) разрешен в /etc/crontab (в Ubuntu), но когда вы запускаете crontab -e вы редактируете пользовательский crontab, который не разрешает этот столбец. IIRC Ubuntu не рекомендует выходить из /etc/crontab вручную, потому что он может быть перезаписан. Смотрите здесь: stackoverflow.com/questions/8475694/…
Показать ещё 1 комментарий
35

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

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, вы можете сделать одну из трех вещей:

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

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


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

    • anacron/etc/cron.* справочники:
      • /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 - сделать его исполняемым
    • См. также страницу man anacron: man anacron
    • Сделать скрипты исполняемыми с помощью chmod a+x <file>
    • Когда выполняются эти cron. * ly script?
      • Для RHEL/CentOS 5.x они настроены в /etc/crontab или /etc/anacrontab для запуска в установленное время
      • Системы 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

Иногда вам нужно указать 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
3

Краткое руководство по настройке задания 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
  • 0
    Ваш синтаксис crontab неверен для 03:45. Поля crontab имеют значение «Минута, а затем час», т. Е. «45 03» - у вас это есть в вашем посте.
  • 0
    спасибо, что заметили! обновлено :)
0

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

Предположим, что ваше имя script - "yourscript.sh"

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

ll script.sh

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

sudo crontab -e

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

crontab -e

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

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

Другой способ сделать это - написать script и запустить его в backgroud

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

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

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

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

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

chmod + x everyday.sh

выполните эту оболочку script в фоновом режиме, используя "nohup". Это приведет к выполнению script даже после выхода из сеанса.

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

nohup./every-day.sh &

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню