Bash - Регулярное выражение для сопоставления кортежей чисел [дубликат]

Амперсанд твой друг

Пожалуйста, не бегайте с ножницами. Вы задаете очень правильные вопросы по всем неправильным причинам.

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

Команда 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 вручную

Вы не должны неправильно использовать atrun, как вы предлагаете. «Все», что он делает (в вашем контексте), — это добавление амперсанда и для выполнения вашей работы в фоновом режиме.

Наиболее вероятная причина сбоя заключается в том, что вы (как и должно быть!) вошли в систему как обычный пользователь. Только root имеет разрешение на использование в по умолчанию.Если вам нужно это изменить - посмотрите справочную страницу для at и:

 /var/at/at.allow        allow permission control
 /var/at/at.deny         deny permission control

Но - опять же - пожалуйста - не делайте этого :-)

Если ничего не получается...

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

1
19.02.2016, 15:58
1 ответ

Функция сценария оболочки 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
0
28.01.2020, 01:26

Теги

Похожие вопросы