The syntax for the crontab entry looks correct. Indeed, if you edit your crontab using «crontab -e» (as you should), you’ll get an error if you specify a syntactically invalid crontab entry anyway.
-
Firstly, does
/path_to_my_php_script/info.phprun correctly from the command-line? -
If so, does it also run correctly like this?:
/bin/sh -c "(export PATH=/usr/bin:/bin; /path_to_my_php_script/info.php </dev/null)" -
If that works, does it work like this?
/bin/sh -c "(export PATH=/usr/bin:/bin; /path_to_my_php_script/info.php </dev/null >/dev/null 2>&1)"
Step (3) is similar to how cron will run your program (as documented in «man 5 cron».
The most likely problem you’re having is that the PATH cron is using to run your program is too restrictive. Therefore, you may wish to add something like the following to the top of your crontab entry (you’ll need to add in whatever directories your script will need):
PATH=~/bin:/usr/bin/:/bin
Also note that cron will by default use /bin/sh, not bash. If you need bash, also add this to the start of your crontab file:
SHELL=/bin/bash
Note that both those changes will affect all the crontab entries. If you just want to modify these values for your info.php program, you could do something like this:
*/2 * * * * /bin/bash -c ". ~/.bashrc; /path_to_my_php_script/info.php"
It’s also worth mentioning that on a system configured for «mail» (in other words a system which has an MTA configured [sendmail/postfix/etc]), all output from crontab programs is sent to you via email automatically. A default Ubuntu desktop system won’t have local mail configured, but if you’re working on a server you can just type «mail» in a terminal to see all those cron mails. This also applies to the «at» command.

Cron — это демон, который запускает задачи по указанному (заданному) времени и который работает в наиболее распространенных дистрибутивах Unix / Linux. Поскольку cronjobs основаны на времени, иногда необходимо проверить и убедиться, что задание выполнялось в запланированное время. Иногда люди настраивают cron чтобы они отправляли вывод скрипта через системную почту или перенаправляюте вывод в файл; однако не все кроны настроены одинаково, и мние из них, могут быть настроены на отправку вывода в /dev/null, и тем самым, препятствуя любой возможности проверить выполняемое задание.
Создать cron задание
Первое что стоит проверить — это наличие ПИДа по крону:
# pgrep crond
Или:
# ps ax | grep crond | grep -Ev grep
crond, если он не настроен иначе, будет отправлять сообщение журнала в syslog каждый раз, когда он вызывает запланированное задание. Самый простой способ проверить работу cron на попытку срабатываания задание, — это проверить лог-файл.
В зависимости от Unix/Linux ОС, данный файл может иметь другое название.
Если у вас, CentOS/Fedora/RedHat, то просмотреть нужно:
# less /var/log/cron
Можно отсеять ненужное и поискать только необходимую крон-джобу, например:
# cat /var/log/cron| grep -E "back" Nov 28 00:00:01 linux-notes CROND[212211]: (root) CMD (/usr/bin/bash /home/linux/scripts/backUPs.sh) Dec 1 00:00:01 linux-notes CROND[126039]: (root) CMD (/usr/bin/bash /home/linux/scripts/backUPs.sh)
Собственно, все наглядно видно.
Если у вас, Ubuntu/Debian, то просмотреть нужно:
# less /var/log/syslog
Иногда, системные администраторы меняют вывод крона и для того, чтобы проверить куда пишуться логи по cron-job-ам, выполните:
# grep cron /etc/rsyslog.conf *.info;mail.none;authpriv.none;cron.none /var/log/messages # Log cron stuff cron.* /var/log/cron
С вывода видно, что у меня используется стандартный файл.
Так же, стоит проверить как настраивали крон-джобы:
# crontab -l
ИЛИ:
# crontab -l -u some_another_user
Возможно было перенаправление вывода в какой-то файл для дальнейшего анализа.
Стоит отметить, то — что некоторые кроны лежат тут:
# ls -lah /etc/cron.daily/ # ls -lah /etc/cron.hourly/ # ls -lah /etc/cron.weekly/ # ls -lah /etc/cron.monthly/
Бывает некоторые задачи запихивают туда.
Чтобы запретить или разрешить добавление крон-задат, нужно прописать юзера в:
# vim /etc/cron.d/cron.allow # vim /etc/cron.d/cron.deny
Так же, можно восспользоватся следующими командами для проверки статуса, запуска/остановки/перезапуска службы:
# service cron status # service cron start # service cron stop # service cron restart
Это все действия были для Linux, но сейчас приведу пример и для mac os x.
Недавно мне пришлось отлаживать работу Cron и проверять, действительно ли она выполняется по заданному расписанию. Я начал искать и проверять все логи и… нашел вроде бы подходящий файл для этого:
# grep cron /var/log/system.log
Но в нем не было признаков логирования крона!
Включить logging для Cron в Mac OSX
Открываем:
# vim /etc/syslog.conf
И прописываем:
cron.* /var/log/cron.log
Для перезапуска syslog-а, выполняем:
# launchctl unload /System/Library/LaunchDaemons/com.apple.syslogd.plist # launchctl load /System/Library/LaunchDaemons/com.apple.syslogd.plist
Проверяем что получилось!
А для помощи, можно вызвать:
# man crontab
А на этом, у меня все, статья «Проверка работы cron в Unix/Linux» завершена.
Let’s say I write cron files via script and modify them direct under
/var/spool/cron/crontabs/. When using the command crontab -e crontab checks the syntax when I exit the editor. Is there any way to do the same check via script?
Josh Correia
3,3563 gold badges29 silver badges46 bronze badges
asked Jul 21, 2015 at 18:07
Crontab with -e option does open your default editor with the current cron file and installs it after exiting.
First of all, save your actual cron file to be sure of not losing or breaking anything.
crontab -l > backup.cron
You can directly install a file that you have cooked:
crontab yourFile.text
Or use a pipe in a script:
#/bin/bash
Variable="your scheduled tasks"
echo $Variable | crontab
You will get the error messages in the case of bad formatting.
More info: man crontab
answered Jul 21, 2015 at 21:11
blashserblashser
8466 silver badges13 bronze badges
2
Use chkcrontab:
pip3 install chkcrontab
chkcrontab /etc/cron.d/power-schedule
Checking correctness of /etc/cron.d/power-schedule
E: 15: 0 12 * foo * * root echo hi
e: FIELD_VALUE_ERROR: foo is not valid for field "month" (foo)
e: INVALID_USER: Invalid username "*"
E: There were 2 errors and 0 warnings.
Or try a shell script 48-verifycron from Wicked Cool Shell Scripts, 2nd Edition, but it’s not as good.
answered Jun 9, 2021 at 13:50
![]()
1
The only reliable way I found is to check the log.
cron checks /etc/crontab every minute, and logs a message indicating that it has reloaded it, or that it found an error.
So after editing, run this:
sleep 60; grep crontab /var/log/syslog | tail
Or, to not wait a full minute, but only until the next minute + 5 seconds:
sleep $(( 60 - $(date +%S) + 5 )) && grep cron /var/log/syslog | tail
Example output with an error:
Jan 9 19:10:57 r530a cron[107258]: Error: bad minute; while reading /etc/crontab
Jan 9 19:10:57 r530a cron[107258]: (*system*) ERROR (Syntax error, this crontab file will be ignored)
Good output:
Jan 9 19:19:01 r530a cron[107258]: (*system*) RELOAD (/etc/crontab)
That’s on Debian 8. On other systems, cron might log to a different file.
(I thought I could avoid hunting for the right log file by using systemd’s journalctl -u cron, but that didn’t show me these log entries, and actually seems to have stopped logging cron events 2 days ago for some reason)
The cron job scheduler has been bundled with unix and linux operating systems for decades. It’s widely used and usually very reliable.
This guide will walk you through locating cron jobs on your server, validating their schedules, and debugging common problems.
In this guide
- The common reasons cron jobs fail
- What to do if your cron job isn’t running when expected
- What to do if your cron job fails unexpectedly
- What to do if nothing else works
The common reasons cron jobs fail
Cron jobs can fail for an infinite variety of reasons but at Cronitor we have observed common failure patterns that
can provide a useful starting point for your debugging process. In the rest of this guide, we will dive into these
common failures with suggestions and solutions.
If you’re adding a new cron job and it is not working…
-
Schedule errors are easy to make
Cron job schedule expressions are quirky and difficult to write. If your job didn’t run when you expected it to,
the easiest thing to rule out is a mistake with the cron expression. -
Cron has subtle environment differences
A common experience is to have a job that works flawlessly when run at the command line but fails whenever
it’s run by cron. When this happens, eliminate these common failures:- The command has an unresovable relative path like
../scripts. (Try an absolute path) - The job uses environment variables. (Cron does not load
.bashrcand similar files) - The command uses advanced bash features (cron uses
/bin/shby default)
Tip:Our free software, CronitorCLI, includes a
shellcommand to test run any job the way cron does. - The command has an unresovable relative path like
-
There is a problem with permissions
Invalid permissions can cause your cron jobs to fail in at least 3 ways. This guide will cover them all.
If your cron job stopped working suddenly…
-
System resources have been depleted
The most stable cron job is no match for a disk that is full or an OS that can’t spawn new threads. Check all the usual graphs to rule this out.
-
You’ve reached an inflection point
Cron jobs are often used for batch processing and other data-intensive tasks that can reveal the constraints of your stack. Jobs often work fine until your data size grows to a point where
queries start timing-out or file transfers are too slow. -
Infrastructure drift occurs
When app configuration and code changes are deployed it can be easy to overlook the cron jobs on each server. This causes infrastructure drift where hosts are retired or credentials change that break the forgotten cron jobs.
-
Jobs have begun to overlap themselves
Cron is a very simple scheduler that starts a job at the scheduled time, even if the previous invocation is still running. A small slow-down can lead to a pile-up of overlapped jobs sucking up available resources.
-
A bug has been introduced
Sometimes a failure has nothing to do with cron. It can be difficult to thoroughly test cron jobs in a development environment and a bug might exist only in production.
What to do if your cron job doesn’t run when expected
You may find that you have scheduled a cron job that is just not running when expected. Follow these steps to locate your scheduled job and diagnose the problem.
-
Locate the scheduled job
Tip:If you know where your job is scheduled, skip this step
Cron jobs are run by a system daemon called
crondthat watches several locations for scheduled jobs. The first step to understanding why your job didn’t start when expected
is to find where your job is scheduled.Search manually for cron jobs on your server
- Check your user crontab with
crontab -ldev01: ~ $ crontab -l # Edit this file to introduce tasks to be run by cron. # m h dom mon dow command 5 4 * * * /var/cronitor/bin/database-backup.sh
- Jobs are commonly created by adding a crontab file in
/etc/cron.d/ - System-level cron jobs can also be added as a line in
/etc/crontab - Sometimes for easy scheduling, jobs are added to
/etc/cron.hourly/,/etc/cron.daily/,/etc/cron.weekly/
or/etc/cron.monthly/ - It’s possible that the job was created in the crontab of another user. Go through each user’s crontab using
crontab -u username -l
Or, scan for cron jobs automatically with CronitorCLI
- Install CronitorCLI for free
-
Run
cronitor listto scan your system for cron jobs:
If you can’t find your job but believe it was previously scheduled double check that you are on the correct server.
- Check your user crontab with
-
Validate your job schedule
Once you have found your job, verify that it’s scheduled correctly. Cron schedules are commonly used because they are expressive and powerful, but like regular expressions can sometimes be difficult to read.
We suggest using Crontab Guru to validate your schedule.- Paste the schedule expression from your crontab into the text field on Crontab Guru
- Verify that the plaintext translation of your schedule is correct, and that the next scheduled execution times match your expectations
- Check that the effective server timezone matches your expectation. In addition to checking system time using
date,
check your crontab file forTZorCRON_TZtimezone declarations that would override system settings.
For example,CRON_TZ=America/New_York
-
Check your permissions
Invalid permissions can cause your cron jobs to fail in at least 3 ways:
- Jobs added as files in a
/etc/cron.*/directory must be owned by root. Files owned by other users will be ignored and you may see a message similar to
WRONG FILE OWNERin your syslog. - The command must be executable by the user that cron is running your job as. For example if your
ubuntuuser crontab invokes a script like
database-backup.sh,ubuntumust have permission to execute the script. The most direct way is to ensure that theubuntu
user owns the file and then ensure execute permissions are available usingchmod +x database-backup.sh. - The user account must be allowed to use cron. First, if a
/etc/cron.allowfile exists, the user must be listed. Separately,
the user cannot be in a/etc/cron.denylist.
Related to the permissions problem, ensure that if your command string contains a
%that it is escaped with a backslash. - Jobs added as files in a
-
Check that your cron job is running by finding the attempted execution in syslog
When cron attempts to run a command, it logs it in syslog.
By grepping syslog for the name of the command you found in a crontab file you can validate that your job is scheduled correctly and cron is running.-
Begin by grepping for the command in
/var/log/syslog(You will probably need root or sudo access.)dev01: ~ $ grep database-backup.sh /var/log/syslog Aug 5 4:05:01 dev01 CRON[2128]: (ubuntu) CMD (/var/cronitor/bin/database-backup.sh)
- If you can’t find your command in the syslog it could be that the log has been rotated or cleared since your job ran. If possible, rule that out by updating the job to run every minute by changing its schedule to
* * * * *. -
If your command doesn’t appear as an entry in syslog within 2 minutes the problem could be with the underlying cron daemon known as
crond. Rule this out quickly by verifying that cron is running by looking up its process ID. If cron is not running no process ID will be returned.dev01: ~ $ pgrep cron 323
-
If you’ve located your job in a crontab file but persistently cannot find it referenced in syslog, double check that
crondhas correctly loaded your crontab file. The easiest way to do this is to force
a reparse of your crontab by runningEDITOR=true crontab -efrom your command prompt. If everything is up to date you will see a message likeNo modification made. Any other
message indicates that your crontab file was not reloaded after a previous update but has now been updated. This will also ensure that your crontab file is free of syntax errors.
-
Begin by grepping for the command in
If you can see in syslog that your job was scheduled and attempted to run correctly but still did not produce the expected result you can assume there is a problem with the command you are trying to run.
What to do if your cron job fails unexpectedly
Your cron jobs, like every other part of your system, will eventually fail. This section will walk you through testing your job and spotting common failures.
-
Test run your command like cron does
When cron runs your command the environment is different from your normal command prompt in subtle but important ways. The first step to troubleshooting is to simulate the cron environment and
run your command in an interactive shell.Run any command like cron does with CronitorCLI
- Install CronitorCLI for free
- To force a scheduled cron job to run immediately, use
cronitor selectto scan your system and present a list of jobs to choose from. - To simulate running any command the way cron does, use
cronitor shell:
Or, manually test run a command like cron does
- If you are parsing a file in
/etc/cron.d/or/etc/crontabeach line is allowed to have an effective «run as» username
after the schedule and before the command itself. If this applies to your job, or if your job is in another user’s crontab, begin by opening a bash prompt as that usersudo -u username bash - By default, cron will run your command using
/bin/sh, not the bash or zsh prompt you are familiar with. Double check your crontab file for an optional
SHELL=/bin/bashdeclaration. If using the default/bin/shshell, certain features that work in bash like[[command]]syntax will cause syntax errors under cron. - Unlike your interactive shell, cron doesn’t load your
bashrcorbash_profileso any environment variables defined there are unavailable in your cron jobs. This is true even if you have aSHELL=/bin/bashdeclaration. To simulate this, create a command prompt with a clean environment.dev01: ~ $ env -i /bin/sh $
- By default, cron will run commands with your home directory as the current working directory. To ensure you are running the command like cron does, run
cd ~at your prompt. -
Paste the command to run (everything after the schedule or declared username) into the command prompt. If crontab is unable to run your command, this should fail too and will hopefully contain a useful error message.
Common errors include invalid permissions, command not found, and command line syntax errors. - If no useful error message is available, double check any application logs your job is expected to produce, and ensure that you are not redirecting log and error messages.
In linux,command >> /path/to/filewill redirect console log messages to the specified file andcommand >> /path/to/file 2>&1will redirect both the console log and error messages.
Determine if your command has a verbose output or debug log flag that can be added to see additional details at runtime. - Ideally, if your job is failing under cron it will fail here too and you will see a useful error message, giving you a chance to modify and debug as needed. Common errors include file not found, misconfigured permissions, and commandline syntax errors.
-
Check for overlapping jobs
At Cronitor our data shows that runtime durations increase over time for a large percentage of cron jobs. As your dataset and user base grows it’s normal to find yourself in a situation
where cron starts an instance of your job before the previous one has finished. Depending on the nature of your job this might not be a problem, but several undesired side effects are possible:- Unexpected server or database load could impact other users
- Locking of shared resources could cause deadlocks and prevent your jobs from ever completing successfully
- Creation of an unanticipated race condition that might result in records being processed multiple times, amplifying server load and possibly impacting customers
To verify if any instances of a job are running on your server presently, grep your process list. In this example, 3 job invocations are running simultaneously:
dev01: ~ $ ps aux | grep database-backup.sh ubuntu 1343 0.0 0.1 2585948 12004 ?? S 31Jul18 1:04.15 /var/cronitor/bin/database-backup.sh ubuntu 3659 0.0 0.1 2544664 952 ?? S 1Aug18 0:34.35 /var/cronitor/bin/database-backup.sh ubuntu 7309 0.0 0.1 2544664 8012 ?? S 2Aug18 0:18.01 /var/cronitor/bin/database-backup.sh
To quickly recover from this, first kill the overlapping jobs and then watch closely when your command is next scheduled to run. It’s possible that a one time failure cascaded into several overlapping instances.
If it becomes clear that the job often takes longer than the interval between job invocations you may need to take additional steps, e.g.:- Increase the duration between invocations of your job. For example if your job runs every minute now, consider running it every other minute.
- Use a tool like
flockto ensure that only a single instance of your command is running at any given time. Using flock is easy. After installing
fromapt-getoryumyou only need to prefix the command in your crontab:
dev01: ~ $ crontab -l # Edit this file to introduce tasks to be run by cron. # m h dom mon dow command * * * * * flock -w 0 /var/cronitor/bin/database-backup.sh
Read more about flock from the man page.
What to do if nothing else works
Here are a few things you can try if you’ve followed this guide and find that your job works flawlessly when run from the cron-like command prompt but fails to complete successful under crontab.
-
First get the most basic cron job working with a command like
date >> /tmp/cronlog. This command will simply echo the execution time to the log file each time it runs. Schedule this to run every minute and tail the logfile for results. -
If your basic command works, replace it with your command. As a sanity check, verify if it works.
-
If your command works by invoking a runtime like
python some-command.pyperform a few checks to determine that the runtime version and environment is correct. Each language runtime has quirks
that can cause unexpected behavior under crontab.- For
pythonyou might find that your web app is using a virtual environment you need to invoke in your crontab. - For
nodea common problem is falling back to a much older version bundled with the distribution. - When using
phpyou might run into the issue that custom settings or extensions that work in your web app
are not working under cron or commandline because a differentphp.iniis loaded.
If you are using a runtime to invoke your command double check that it’s pointing to the expected version from within the cron environment.
- For
-
If nothing else works, restart the cron daemon and hope it helps, stranger things have happened. The way to do this varies from distro to distro so it’s best to ask google.
Related Guides
Cronitor automatically finds and monitors cron jobs. Complete your setup in minutes.
Get Started Free
Я хочу проверить, работает ли определенный crontab правильно. Я добавил работу, как это:
*/2 * * * * /path_to_my_php_script/info.php >/dev/null 2>&1
Я знаю, что перенаправляю на нулевое устройство, но не уверен, что приведенная выше команда хороша.
* Редактировать 1: В моем / var / log / syslog каждые две минуты у меня появляется следующая ошибка:
(CRON) error (grandchild #2788 failed with exit status 2)
* Редактировать 2: Нет ошибок в журналах с этим новым заданием:
*/2 * * * * /usr/bin/php /path_to_my_php_script/info.php >/dev/null 2>&1
Ответы:
Синтаксис для записи в crontab выглядит правильно. Действительно, если вы отредактируете свой crontab, используя « crontab -e» (как и должно быть), вы получите ошибку, если в любом случае укажете синтаксически неверную запись в crontab.
-
Во-первых,
/path_to_my_php_script/info.phpправильно ли работает из командной строки? -
Если так, это также работает правильно, как это ?:
/bin/sh -c "(export PATH=/usr/bin:/bin; /path_to_my_php_script/info.php </dev/null)" -
Если это работает, это работает так?
/bin/sh -c "(export PATH=/usr/bin:/bin; /path_to_my_php_script/info.php </dev/null >/dev/null 2>&1)"
Шаг (3) аналогичен тому, как cron будет запускать вашу программу (как описано в «man 5 cron»).
Наиболее вероятная проблема, с которой вы сталкиваетесь, заключается в том, что cron PATH использует для запуска вашей программы слишком строгие ограничения. Поэтому вы можете добавить что-то вроде следующего в начало вашей записи crontab (вам нужно будет добавить в любые каталоги, которые понадобятся вашему скрипту):
PATH=~/bin:/usr/bin/:/bin
Также обратите внимание, что по умолчанию будет использоваться cron /bin/sh, а не bash. Если вам нужен bash, также добавьте это в начало вашего файла crontab:
SHELL=/bin/bash
Обратите внимание, что оба эти изменения затронут все записи в crontab. Если вы просто хотите изменить эти значения для вашей info.phpпрограммы, вы можете сделать что-то вроде этого:
*/2 * * * * /bin/bash -c ". ~/.bashrc; /path_to_my_php_script/info.php"
Также стоит упомянуть, что в системе, настроенной на «почту» (другими словами, в системе, в которой настроен MTA [sendmail / postfix / etc]), весь вывод из программ crontab отправляется вам по электронной почте автоматически. В стандартной настольной системе Ubuntu локальная почта не будет настроена, но если вы работаете на сервере, вы можете просто набрать «mail» в терминале, чтобы увидеть все эти cron-сообщения. Это также относится к команде » at«.
Хотя очень редко, иногда Cron перестает работать должным образом, даже если служба работает. Вот как проверить, что crond работает и остановить / запустить службу.
В Linux:
service crond status
service crond stop
service crond start
В Ubuntu и других системах на основе Debian:
service cron status
service cron stop
service cron start
Не перенаправляйте вывод ошибок в / dev / null и grep / var / log / syslog для вывода cron.
grep cron /var/log/syslog
Вы можете сразу же показать ошибки при сохранении файла после редактирования /etc/crontabили файлов внутри /etc/cron.d/с помощью:
tail -f /var/log/syslog | grep --line-buffered cron
Если редактирование в порядке, вы увидите только RELOADуведомление, ошибки будут появляться как
Jul 9 09:39:01 vm cron[1129]: Error: bad day-of-month; while reading /etc/cron.d/new
Вы можете увидеть свой активный cron с помощью команды терминала:
crontab -l
Вот параметры по порядку:
-
мин (0 — 59)
-
час (0 — 23)
-
день месяца (1 — 31)
-
месяц (1 — 12)
-
день недели (0 — 6) (воскресенье = 0)
-
команда
Итак, вы вызываете свой сценарий каждую первую минуту каждого часа. Вы должны проверять свои результаты с более частым интервалом для целей тестирования:
* * * * * <command> #Runs every minute
Это будет называть это каждую минуту!
Для временной части в каждой строке вы можете использовать этот тестер cron для проверки / проверки вашего определения времени cron.
Я считаю, что вы также можете использовать run-partsдля запуска заданий cron вне группы. Это именно то, что cron использует для запуска периодических заданий cron, поэтому, предоставляя соответствующие аргументы, вы можете запускать их в любое время.
Если вы просто хотите запустить один файл вместо всех заданий cron, определенных, например, /etc/cron.dailyвам нужно будет указать аргумент regex вместе с действительным regex.run-parts --list --regex '^p.*d$' /etc
Имейте в виду, что задания cron обычно называются без расширения и помечаются как исполняемые, поэтому убедитесь, что ваши сценарии похожи, хотя использование регулярного выражения может позволить вам запустить сценарий с расширением.
ах !!
получил ответ сам, проверил и не нашел crondвнутри директории установки по умолчанию т.е./etc/init.d/
сейчас попробую ответить.
примечание — я проверить cron.allow, cron.denyтоже. Пока все хорошо.