Если я crontab -l
в командной строке, я вижу следующую строку:
# * * * * * /usr/bin/php /home/user/every_minute_script.php
Чтобы запустить этот cronjob, мне нужно отредактировать файл с помощью команды crontab -e
, удалить символ комментария в начале строки, сохранить отредактированный файл и выйти из редактора.
Чтобы остановить этот 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
которая проверяет флаг, чтобы увидеть, нужно ли ему что-либо делать? Таким образом, он может разгоняться, а затем быстро останавливаться, если нет работы.
Или это слишком неэффективно для ваших целей?