Crontab linux запуск скрипта sh

Running a simple shell script as a cronjob

The script runs fine from the terminal but can’t get it to run as a cronjob. So far I’ve tried these in crontab:

SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin * * * * * /bin/bash /home/myUser/scripts/test.sh 
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/myUser/scripts 

From what I’ve gathered the solution might be in the PATH variable but I can’t figure out what it is since my understanding is very limited at this point. So my question is, how do I get my scripts to run as cronjobs? EDIT: the file has rwx permissions for all users. This is just for testing purposes. EDIT: cronjobs such as * * * * * touch /home/myUser/scripts/test.txt work but it wont run scripts.

I would add that you specify your shell as /bin/sh in the crontab (which is the default) however your script wants a bash shell (different to sh). Check to see if running your script using sh yourScript.sh still works?

5 Answers 5

The easiest way would be to use a GUI:

For Gnome use gnome-schedule (universe)

sudo apt-get install gnome-schedule 

For KDE use kde-config-cron

It should be pre installed on Kubuntu 

But if you use a headless linux or don´t want GUI´s you may use:

If you type it into Terminal you´ll get a table.
You have to insert your cronjobs now.
Format a job like this:

* * * * * YOURCOMMAND - - - - - | | | | | | | | | +----- Day in Week (0 to 7) (Sunday is 0 and 7) | | | +------- Month (1 to 12) | | +--------- Day in Month (1 to 31) | +----------- Hour (0 to 23) +------------- Minute (0 to 59) 

There are some shorts, too (if you don´t want the *):

@reboot --> only once at startup @daily ---> once a day @midnight --> once a day at midnight @hourly --> once a hour @weekly --> once a week @monthly --> once a month @annually --> once a year @yearly --> once a year 

If you want to use the shorts as cron (because they don´t work or so):

@daily --> 0 0 * * * @midnight --> 0 0 * * * @hourly --> 0 * * * * @weekly --> 0 0 * * 0 @monthly --> 0 0 1 * * @annually --> 0 0 1 1 * @yearly --> 0 0 1 1 * 

I don’t think that’s the problem. See the second edit. Crontab doesn’t run scripts but it works fine otherwise.

Читайте также:  Linux what is virtual memory size

What directory is file.txt in? cron runs jobs in your home directory, so unless your script cd s somewhere else, that’s where it’s going to look for/create file.txt.

EDIT: When you refer to a file without specifying its full path (e.g. file.txt , as opposed to the full path /home/myUser/scripts/file.txt ) in shell, it’s taken that you’re referring to a file in your current working directory. When you run a script (whether interactively or via crontab), the script’s working directory has nothing at all to do with the location of the script itself; instead, it’s inherited from whatever ran the script.

Thus, if you cd (change working directory) to the directory the script’s in and then run it, file.txt will refer to a file in the same directory as the script. But if you don’t cd there first, file.txt will refer to a file in whatever directory you happen to be in when you ran the script. For instance, if your home directory is /home/myUser, and you open a new shell and immediately run the script (as scripts/test.sh or /home/myUser/scripts/test.sh ; ./test.sh won’t work), it’ll touch the file /home/myUser/file.txt because /home/myUser is your current working directory (and therefore the script’s).

When you run a script from cron , it does essentially the same thing: it runs it with the working directory set to your home directory. Thus all file references in the script are taken relative to your home directory, unless the script cd s somewhere else or specifies an absolute path to the file.

Источник

Задачи cron и автоматизация в Linux

Если вы заняты в сфере IT, у вас часто может возникать потребность в автоматизации каких-то повторяющихся задач. Например, если нужно ежедневно делать бэкапы, ежемесячно архивировать логи, еженедельно удалять файлы для очистки пространства.

И если ваша рабочая ОС — Linux, для автоматизации всех этих процессов можно использовать такой инструмент как cron.

Что такое cron?

Cron — это утилита для составления расписания задач, имеющаяся в Unix-подобных системах. Функционал этой утилиты включается демоном crond и выполняется в фоне. Для запуска скриптов cron читает crontab («таблицы cron).

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

Когда речь идет об отдельных пользователях и их задачах, cron руководствуется файлом /var/spool/cron/crontabs.

Что собой представляют задачи cron?

Любая задача, которую вы запланировали в cron, называется задачей cron. Эти задачи помогают нам автоматизировать рутинные действия, выполняемые регулярно с определенной периодичностью.

Читайте также:  Linux определение прав доступа

Давайте рассмотрим подробнее работу cron-задач.

Доступ к cron

Чтобы пользователь имел доступ к задачам cron, админ должен разрешить это в файле /etc/cron.allow.

Если вы получаете уведомление, как на скриншоте ниже, значит, вам не разрешено использовать cron.

Чтобы разрешить Джону доступ к cron, включите его имя в /etc/cron.allow. После этого он сможет создавать и редактировать cron-задачи.

Пользователям также можно запретить доступ к cron-задачам, внеся их имена в файл /etc/cron.d/cron.deny.

Как добавлять задачи cron в Linux

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

# Check cron service on Linux system sudo systemctl status cron.service

Синтаксис задач cron

Для добавления и вывода задач crontab используется следующие флаги:

  • crontab -e: редактирование содержимого crontab для добавления, удаления или изменения задач.
  • crontab -l: вывод всех cron-задач текущего пользователя.
  • crontab -u username -l: вывод задач другого пользователя.
  • crontab -u username -e: редактирование задач другого пользователя.

Выведя на экран задачи cron, вы увидите что-то типа этого:

# Cron job example * * * * * sh /path/to/script.sh

— звездочки * * * * * представляют минуты, часы, дни, месяцы и дни недели (соответственно).

Значение Описание
Минуты 0-59 Команда будет выполняться в указанную минуту.
Часы 0-23 Команда будет выполняться в указанный час.
Дни 1-31 Команда будет выполняться в указанный день месяца.
Месяцы 1-12 Месяц, в котором должна выполняться команда.
Дни недели 0-6 Дни недели, по которым должна запускаться команда. Здесь 0 — воскресенье.

— sh говорит о том, что это bash-скрипт, и запускаться он должен из /bin/bash.

— /path/to/script.sh указывает путь к скрипту.

От редакции Techrocks. Нам показалось, что в пояснении синтаксиса не хватает подробностей, поэтому дополняем.

Указать периодичность меньше минуты нельзя, потому что cron читает расписание раз в минуту.

Время и дату выполнения можно указывать:

  • звездочками * — тогда задача выполняется каждую/й — в зависимости от того, на какой позиции стоит звездочка
  • целыми числами — чтобы указать точно время или дату
  • целыми числами через запятую — перечисляем нужные минуты, часы и т. д.
  • диапазонами, через дефис (например, 1-10) — чтобы задача выполнялась в определенный диапазон времени или дат
  • с определенным шагом.

На последнем пункте остановимся подробнее. Для указания шага используется синтаксис */целое-число . Указанное целое число — шаг.

Читайте также:  Удалить директорию с файлами линукс

Например, если на позиции месяца стоит */4 , это значит, что задача будет выполняться каждый четвертый месяц . А если на позиции минут стоит 0-59/2 , это значит, что задача будет выполняться каждые две минуты.

Ниже представлена схема синтаксиса cron-задач.

* * * * * sh /path/to/script/script.sh | | | | | | | | | | | Команда или скрипт, которые нужно выполнить | | | | | | | | | | | | | | | | | | | День недели(0-6) | | | | | | | Месяц(1-12) | | | | | Число месяца(1-31) | | | Час(0-23) | Минута(0-59)

Примеры cron-задач

В таблице представлены три примера cron-задач.

Расписание Значение
5 0 * 8 * В 00:05 в августе
5 4 * * 6 В 04:05 в субботу
0 22 * * 1-5 В 22:00 ежедневно, с понедельника по пятницу

Если вам не удается с лету понять, на когда назначено выполнение задач, не огорчайтесь. Вы можете попрактиковаться в генерации расписаний cron на crontab guru.

Как создавать задачу cron

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

1. Создайте скрипт с именем date-script.sh. Он должен выводить системную дату и время и добавлять их в файл. Скрипт выглядит так:

2. Сделайте этот скрипт исполняемым, отредактировав права при помощи chmod.

3. Добавьте скрипт в crontab при помощи crontab -e.

Мы указали, что скрипт должен выполняться каждую минуту:

4. Проверьте результат, просмотрев содержимое файла date-out.txt. В этом файле ежеминутно должна добавляться запись с системным временем.

Возможные проблемы и их решение

Cron-задачи очень полезны, но они не всегда срабатывают так, как вы задумали. К счастью, есть несколько эффективных способов справиться с этим.

1. Проверьте расписание

Для начала нужно проверить, что за расписание установлено для задачи. Сделать это можно при помощи команд crontab -l или crontab -u username -l (мы говорили о них ранее).

2. Просмотрите логи cron

Проверьте, запускается ли cron в намеченное время. Это можно посмотреть в логах, в var/log/cron. В некоторых дистрибутивах логи можно найти в /var/log/syslog.

Если в логах есть записи в соответствующее время, это означает, что сам cron запускается по расписанию.

Ниже представлен пример логов для задач cron. Обратите внимание на первый столбец с метками времени. В конце строк указаны запускаемые скрипты.

3. Перенаправьте output в файл

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

# Redirect cron output to a file * * * * * sh /path/to/script.sh &> log_file.log

Итоги

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

Автоматизация в Linux завязана на задачах cron, так что эту утилиту определенно стоит изучить. Поэкспериментируйте с ней!

Источник

Оцените статью
Adblock
detector