Пожалуйста, не бегайте с ножницами. Вы задаете очень правильные вопросы по всем неправильным причинам.
at
использует cron
для планирования заданий в будущем. Они являются отличными инструментами для этой цели.Но когда вы используете инструменты планирования, чтобы добиться цели сейчас, вы пересекаете воду, чтобы наполнить ведро. МелБурслан указывает вам на это и дает правильный ответ. Затем вы пытаетесь прояснить свою потребность, но, к сожалению, упускаете из виду его точку зрения. Вы настаиваете на использовании at
- когда вы должны просто использовать амперсанд &
.
Для других читателей: вопрос больше похож на "Как мне заставить php запускать (порождать) другой скрипт и продолжать работу, не дожидаясь завершения скрипта?".
Это приведет вас к отличным фундаментальным знаниям Unix, как показывает МелБурслан:
nohup /path/to/myprogram & 2>&1
nohup
гарантирует, что команда будет продолжать работать в фоновом режиме, даже если текущий пользователь выйдет из системы.
&
— это то, что вам, вероятно, не хватает: амперсанд отключает процесс и переводит его в фоновый режим.
2>&1
объединяет stderr
(2) с stdout
(1) и nohup
, а затем неявно отправляет вывод в nohup. out
Если не добавить амперсанд - то вызывающая сторона (здесь php) будет ждать завершения задания.
Если вы затем спуститесь в кроличью нору, как указывает cas , вы увидите, как люди используют эту технику с shell_exec
и exec
(см. здесь)
Дополнительная важная информация для понимания из этого:
Если вас не интересуют какие-либо выходные данные, вы можете отправить их по адресу /dev/null
следующим образом:
> /dev/null
Это перенаправит stdout
.Если вы также не хотите никаких сообщений об ошибках, вы можете перенаправить stderr
следующим образом:
2> /dev/null
Вы можете объединить их в одну строку:
> /dev/null 2> /dev/null
И есть короткая форма этого - отправить stderr в stdout - и отправить stdout в "ничего":
> /dev/null 2>&1
В вашем примере неправильно используется at
:
shell_exec("echo /usr/local/bin/php -q scripts/myfile.php {$var1} {$var2} | at now");
Но если вы просто хотите, чтобы он продолжил ваш скрипт - просто добавьте амперсанд &
shell_exec("/usr/local/bin/php -q scripts/myfile.php {$var1} {$var2} &");
Если вы не используете какой-либо вывод - тогда вы должны перенаправить его.
shell_exec("/usr/local/bin/php -q scripts/myfile.php {$var1} {$var2} > /dev/null 2>&1 &");
Наиболее элегантным вариантом, предложенным Брентом Брэйсли, будет:
exec("nohup /usr/bin/php -q scripts/myfile.php {$var1} {$var2} > /dev/null 2>&1 &");
Команда at
назначает выполнение команд сценарием atrun
. .
Если вы прочитаете справочную страницу для по адресу
, вы обнаружите:
Note that at is implemented through the cron(8) daemon by calling
atrun(8) every five minutes. This implies that the granularity of at
might not be optimal for every deployment. If a finer granularity is
needed, the system crontab at /etc/crontab needs to be changed.
Вы уже настроили crontab. Я бы не советовал в вашем случае. Но если вы настаиваете, вам следует взглянуть на man crontab (5):
string meaning
------ -------
@reboot Run once, at startup of cron.
@yearly Run once a year, "0 0 1 1 *".
@annually (same as @yearly)
@monthly Run once a month, "0 0 1 * *".
@weekly Run once a week, "0 0 * * 0".
@daily Run once a day, "0 0 * * *".
@midnight (same as @daily)
@hourly Run once an hour, "0 * * * *".
@every_minute Run once a minute, "*/1 * * * *".
@every_second Run once a second.
Это означает, что вы можете изменить */1
(один раз в минуту) на @каждую_секунду
.
Но - пожалуйста - не надо :-)
Вы не должны неправильно использовать atrun
, как вы предлагаете. «Все», что он делает (в вашем контексте), — это добавление амперсанда и
для выполнения вашей работы в фоновом режиме.
Наиболее вероятная причина сбоя заключается в том, что вы (как и должно быть!) вошли в систему как обычный пользователь. Только root имеет разрешение на использование в
по умолчанию.Если вам нужно это изменить - посмотрите справочную страницу для at и:
/var/at/at.allow allow permission control
/var/at/at.deny deny permission control
Но - опять же - пожалуйста - не делайте этого :-)
Если ничего не получается, пожалуйста переформулируйте свой вопрос. Запуск инструмента планирования сейчас не является основной причиной вашей проблемы. Если вышеперечисленного недостаточно - значит надо копать глубже.
Функция сценария оболочки POSIX , использует расширение параметра для получения первого и второго числа, -eq
завершается успешно только в том случае, если есть два аргумента с одинаковыми номерами, (и терпит неудачу, если аргументов меньше или больше, или если какие-либо содержат буквы )и !=
, чтобы проверить наличие пробела. Возвращает true , только если это кортеж из двух чисел:
is_tup() { [ ${1% *} -eq ${1% *} -a \
${1#* } -eq ${1#* } -a "${1% *}" != "$1" ] 2> /dev/null ; }
Тест:
echo '12 123
23 3246543
123 345
34 23
1 234
123 123 123
1235124
123w123 123' |
while read x ; do is_tup "$x" && a=yes || a=no ; printf '%s\t%s\n' $a "$x" ; done
Выход:
yes 12 123
yes 23 3246543
yes 123 345
yes 34 23
yes 1 234
no 123 123 123
no 1235124
no 123w123 123