How do I add an entry to my crontab?
I am using crontab for the first time. Want to write a few very simple test cron tasks, and run them.
says */1: No such file or directory . Also, how do I list the currently running cron tasks (not just the ones I own, but ones started by other users such as root as well). And how do I delete a particular cron task?
For instruction on how to edit and create cron jobs and an explanation on the files structure see this crontab syntax guide
7 Answers 7
You can’t use crontab like that. Use man crontab to read about the correct way of calling this utility.
You’ll want to use crontab -e to edit the current user’s cron entries (you can add/modify/remove lines). Use crontab -l to see the current list of configured tasks.
As for seeing other user’s crontabs, that’s not possible without being root on default installations. See How do I list all cron jobs for all users for some ways to list everything (as root).
Note: be very careful when you use shell globbing characters on the command line ( * and ? especially). * will be expanded to the list of files in the current directory, which can have unexpected effects. If you want to pass * as an argument to something, quote it ( ‘*’ ).
so I do crontab -e and in editor I put entry */1 * * * * echo «hi» and when I save this file, I see the message that crontab: installing new crontab. but I don’t see the hi messages appearing on screen. What am I missing now? thanks.
crontab’s output will never go to your «screen». From the POSIX man page for crontab: «If standard output and standard error are not redirected by commands executed from the crontab entry, any generated output or errors will be mailed, via an implementation-dependent method, to the user.»
The job’s output will be sent to the job owner’s local mail box. (Running mail from the command line should access your local mail box, if configured.) To see the ‘hi’ in graphic environment, you could set the task as: * * * * * export DISPLAY=:0; xmessage ‘hi’ .
This answer would be much more useful if the first line were removed entirely. It’s not nice to effectively start your answer with RTFM, even if you do then go on to answer properly too.
There are two ways of editing one’s crontab :
- interactively, using crontab -e , which will open the crontab in the editor specified by $VISUAL or $EDITOR , or
- non-interactively, using crontab crontab.txt , which will simply import the crontab entries from the file crontab.txt , replacing the existing active crontab for the current user.
The issue that you have is that you are simply using the crontab command wrong.
The following concerns non-interactive crontab manipulation:
So, to remove particular tasks programmatically, you could do something like
$ crontab -l | grep -v 'PATTERN' >crontab.txt && crontab crontab.txt
where PATTERN is a regular expression that will match the task(s) that you’d like to remove. Here, crontab -l will give you your current crontab .
Or, if you have entries in a file called crontab-fragment.txt that you want to remove from the active crontab,
$ crontab -l | grep -v -Fx -f crontab-fragment.txt >crontab.txt && crontab crontab.txt
This reads the current crontab and filters out (removes) any line that also occurs in the file crontab-fragment.txt in the current directory (using a full line string comparison). The result is saved to crontab.txt and then loaded from there to replace the current crontab.
To add one or several task, do something like
$ crontab -l | cat - crontab-fragment.txt >crontab.txt && crontab crontab.txt
This is assuming that the file crontab-fragment.txt contains the entries that you would like to add. It reads the current crontab, appends the entries from crontab-fragment.txt to this and creates crontab.txt . The crontab.txt file then replaces the current crontab.
How to add a new task in crontab using a script
I need to use crontab to add new tasks to be done at a certain time. I need to add these tasks using a script. I will do something like:
to open my own list of tasks. The problem is the previous command opens a temporary file and I can’t locate it. (It has a random name in /tmp or something?) I will do something like:
echo "5 5 5 5 5 user command" | crontab -e
to write a new line in my own crontab list but this doesn’t work. Am I wrong in something? Does anyone has an idea for solving this? I’m using Ubuntu.
2 Answers 2
You are having difficulty with your current approach because crontab -e doesn’t read from stdin. However, crontab without the -e switch, does read from stdin.
The most obvious way is to just append the new cron job to the existing crontab:
crontab -l > current_cron cat >> current_cron
The obvious issue with this approach is that there is no check to see if the cron job exists already. That's where it can get a little tricky.
One way to tackle that would be to have a "script managed section" in crontab, typically, at the bottom:
# DO NOT MODIFY THE SECTION BELOW MANUALLY. IT'S MANAGED BY AUTOMATION. #---script managed section--- "cron job 1" "cron job 2"
Then, a script can manage this section - it is best to have a single script that manages all automatic cron jobs:
crontab -l > current_cron sed '/---script managed section---/q' current_cron > new_cron cat >> new_cron
If we need even more fine-grained control, then we can have a section for each managed cron job, with begin and end markers and make the script deal with a specific section each time.
However, there is a better idea for Ubuntu. We can completely do away with crontab and use /etc/cron.d instead. Here, we have one file for each cron job which follows the exact format of a cron job spec. Since there is a 1:1 correspondence between cron jobs and /etc/cron.d files, they are managed directly as files rather than through crontab command and hence, automation is much easier.
In Debian, cron reads the files in the /etc/cron.d directory. cron treats the files in /etc/cron.d as in the same way as the /etc/crontab file (they follow the special format of that file, i.e. they include the user field). However, they are independent of /etc/crontab: they do not, for example, inherit environment variable settings from it. This change is specific to Debian.
Как добавить команду в Cron
При администрировании и настройке серверов очень часто надо настраивать автоматическое выполнение определенных скриптов или программ через равные промежутки времени. Это может быть резервное копирование, отправка отчётов о состоянии сервера или другие тому подобные вещи.
Служба cron - это стандартный планировщик задач в Linux. С помощью него вы можете запланировать выполнение команды или скрипта один или несколько раз, в определенную минуту, час, день, неделю и месяц. В этой статье мы подробно рассмотрим как выполняется настройка Cron в Linux на примере дистрибутива Ubuntu.
Как посмотреть задания cron
Думаю, что начать следует не с настройки, а именно как посмотреть уже настроенные задачи cron. На самом деле задачи хранятся в трёх местах:
- База данных crontab - здесь хранятся все записи cron пользователя, которые вы настраиваете вручную;
- /etc/crontab и /etc/cron.d/ - системные записи cron и записи cron различных пакетов;
- /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly, /etc/cron.monthly - здесь лежат скрипты, которые надо выполнять раз в час, день, неделю и месяц соответственно, обычно эти папки используются различными пакетами, но вы тоже можете их использовать для своих скриптов.
Чтобы посмотреть задания cron добавленные текущим пользователем используйте команду crontab и опцию -l:
Все задачи cron разделены по пользователям, и команды из этих задач будут выполнятся от имени того пользователя, для которого они были добавлены. Чтобы посмотреть задачи другого пользователя используйте опцию -u:
А теперь давайте поговорим о том, как добавить команду cron для нужного вам пользователя.
Добавление команды в cron
Чтобы добавить задание cron из терминала можно использовать утилиту crontab. Для открытия временного файла с текущими заданиями этого пользователя выполните:
Все запланированные действия будут выполнятся от текущего пользователя, если вы хотите указать другого пользователя используйте опцию -u:
sudo crontab -u имя_пользователя -e
Команда откроет текстовый редактор, где вы сможете добавлять или редактировать задания cron. Будет использован установленный по умолчанию редактор, например, vim:
Каждая задача формируется следующим образом:
минута(0-59) час(0-23) день(1-31) месяц(1-12) день_недели(0-7) /полный/путь/к/команде
Чтобы подставить любое значение используйте звездочку "*". Первые пять параметров характеризуют время выполнения, а последний, это путь к команде или скрипту, который нужно выполнить. Обратите внимание, что значение переменной PATH здесь не действует, поэтому путь надо писать полностью либо объявлять свою переменную PATH в начале файла настройки. Давайте сделаем простой скрипт, который будет выводить в лог дату своего запуска и поможет отладить всё это:
sudo vi /usr/local/bin/script.sh
#!/bin/bash
echo $(date) >> /var/log/testcron.log
Сделайте скрипт исполняемым:
sudo chmod ugo+x /usr/local/bin/script.sh
Самый простой пример как запускать cron каждую минуту. Вместо всех параметров ставим просто звездочку:
Или только в нулевую минуту, то есть в начале каждого часа или другими словами запуск cron каждый час:
Можно указать несколько значений через запятую, для того чтобы определить несколько точек запуска. Например, будем запускать скрипт cron каждые 15 минут:
Можно записывать значения через дефис чтобы указывать промежутки точек запуска. Например, для того чтобы запускать скрипт каждую минуту, но только первые 10 минут каждого часа используйте:
Чтобы чтобы настроить интервал выполнения более тонко можно использовать слеш (/) с помощью этого символа и звездочки можно указать шаг с которым будет выполнятся команда. Например, каждые пять минут:
Чтобы запустить cron каждые 10 минут используйте:
А для запуска cron каждые 30 минут:
Аналогичным образом задаются часы, например, выполнять скрипт только 6:00 и 18:00:
0 6,18 * * * /usr/local/bin/script.sh
А вот запустить cron каждую секунду или раз в 30 секунд не получится. Минимальная единица времени в cron это минута. Но можно создать команду, которая будет запускаться раз в минуту и по 30 секунд спать и затем снова делать:
* * * * * /usr/local/bin/script.sh && sleep 30 && /usr/local/bin/script.sh
Это довольно плохой подход и лучше так не делать. Кроме того, для экономии времени при работе с cron можно использовать специальные слова-маркеры времени. Вот они:
Для подбора правильной комбинации даты можно использовать сервис crontab.guru. Он позволяет в реальном времени посмотреть когда будет выполнено то или иное условие:
Когда настройка cron linux будет завершена, сохраните изменения и закройте файл. Для этого в Nano нажмите Ctrl+O для сохранения и Ctrl+X для закрытия редактора, а в Vim нажмите Esc и наберите :wq. Теперь новые задания Cron будут добавлены и активированы. Посмотреть как выполняется ваш Cron вы можете с помощью скрипта, который я привел выше либо в лог файле. Сервис cron пишет свои логи в стандартный журнал syslog. В Ubuntu они сохраняются в файле /var/log/syslog:
cat /var/log/syslog | grep CRON
Если во время работы возникнут ошибки cron, они тоже будут здесь. Если же вам надо добавить задание Cron из какого либо скрипта, то вы всегда можете поместить свой скрипт в папку /etc/cron.d или /cron/hourly. чтобы выполнять его когда надо, только не забудьте сделать скрипт исполняемым.
Выводы
В этой статье мы разобрались как выполняется настройка cron linux на примере Ubuntu. Как видите, все только кажется сложным, но на самом деле просто если разобраться.
Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.