Как запустить / остановить cronjob с помощью PHP?

Если я crontab -l в командной строке, я вижу следующую строку:

 # * * * * * /usr/bin/php /home/user/every_minute_script.php 

Чтобы запустить этот cronjob, мне нужно отредактировать файл с помощью команды crontab -e , удалить символ комментария в начале строки, сохранить отредактированный файл и выйти из редактора.

Чтобы остановить этот cronjob, выполните те же шаги, но добавьте комментарий в начале строки.

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

Related of "Как запустить / остановить cronjob с помощью PHP?"

Я провел некоторое исследование и нашел в форуме следующее сообщение:

Вызовите «crontab -e» с переменной окружения EDITOR, установленной в php-скрипт. Этот скрипт может изменить файл, и когда он выйдет из crontab, он перечитает файл и обновит его.

Итак, я что-то пробовал, и это сработало. Я вставлю рабочий код ниже:

 #!/usr/bin/php <?php $on = "* * * * * /usr/bin/php /home/user/every_minute_script.php\n"; $off = "# * * * * * /usr/bin/php /home/user/every_minute_script.php\n"; $param = isset( $argv[1] ) ? $argv[1] : ''; $filename = isset( $argv[2] ) ? $argv[2] : ''; if ( $param == 'activate' ) { shell_exec( 'export EDITOR="/home/user/cron.php on"; crontab -e' ); } elseif( $param == 'deactivate' ) { shell_exec( 'export EDITOR="/home/user/cron.php off"; crontab -e' ); } elseif( in_array( $param, array( 'on', 'off' ) ) ) { if ( !is_writable( $filename ) ) exit(); $crontab = file( $filename ); $key = array_search( $param == 'on' ? $off : $on, $crontab ); if ( $key === false ) exit(); $crontab[$key] = $param == 'on' ? $on : $off; sleep( 1 ); file_put_contents( $filename, implode( '', $crontab ) ); } exit(); ?> 

Как бы то ни было, у нас есть один скрипт cron.php расположенный в папке /home/user , установленный как исполняемый ( chmod a+x cron.php ) и chmod a+x cron.php из командной строки (PHP-CLI). Позже я подберу его, чтобы бежать из Интернета, что является моим намерением.

Использование: ./cron.php activate чтобы включить cronjob и ./cron.php deactivate чтобы отключить его.

Скрипт правильно устанавливает переменную среды EDITOR (сам по себе), а затем вызывает crontab -e , который в свою очередь вызывает EDITOR (который теперь является тем же скриптом cron.php), передавая временное расположение файла crontab в качестве аргумента. Затем правильная строка crontab будет найдена и изменена, а измененная версия будет сохранена, заменив временный файл. Когда скрипт выйдет, crontab будет обновляться.

Это делает именно то, что я хотел, и отвечал моим потребностям.

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

Вместо того, чтобы программировать с помощью crontab (который является тонким и быстрым для гнева), я предлагаю сделать чек внутри your_minute_script.php:

 if (!file_exists('/your/path/run_every_minute_script')) { exit; } 

Таким образом, скрипт будет запускаться каждую минуту, но если условие не выполняется ( /your/path/run_every_minute_script не существует), он немедленно прекратится без дальнейшей обработки.

(Конечно, вы можете заменить здесь различные условия, например, проверить базу данных на наличие разрешения и т. Д.)


Если вам нужен вывод, отправленный по почте, вы можете использовать сценарий оболочки. Crontab:

 * * * * * /your/path/wrapper.sh > /dev/null 2> /dev/null 

Затем скрипт-оболочка запускает задание, собирает его выходные данные и ошибки, а если они не пусты, отправляет их по почте (обратите внимание, что вы также можете сделать проверку внутри скрипта-оболочки, мы не сделали этого, поскольку он полагался на базу данных ).

Вот довольно классный учебник для создания именно такого рода функций с PHP.

Поставьте условие остановки / запуска в начале every_minute_script.php

 if($condition == false) { exit(); } 

Не могли бы вы поместить какую-то логику в начале every_minute_script.php которая проверяет флаг, чтобы увидеть, нужно ли ему что-либо делать? Таким образом, он может разгоняться, а затем быстро останавливаться, если нет работы.

Или это слишком неэффективно для ваших целей?