2015-12-03 1 views
2

Я хотел убить процесс и удалить флаг, указывающий, что процесс запущен. cron:pkill с флагом -f в crontab не работает команда после запятой

00 22 * * 1-5 pkill -f script.sh >log 2>&1 ; rm lock >log 2>&1 

Это прекрасно работает, когда я запускаю его на терминале. Но в crontab rm не работает. Все, что я могу представить, это то, что вся строка после флага -f принимается за аргументы для pkill. Любая причина, почему это происходит?

Работает с ними как отдельные записи cron. Также выполняется pkill без флага -f (хотя он не убивает процесс, так как я хочу, чтобы шаблон выполнялся в цельной команде).

ответ

1

короткий ответ: он просто убил себя!

мой ответ объяснен: , если вы позволите команде начать работу с комом, она будет выполнена в подоболочке. скорее всего, линия вы найдете в пс или Htop будет выглядеть следующим образом:

/bin/sh -c pkill -f script.sh >log 2>&1 ; rm lock >log 2>&1 

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

Дело в том, что целая строка получила один PID (идентификатор процесса) и является одной из команд, которые pgrep/pkill анализирует при использовании параметра «-f». как указан на странице человека:

-f, --full 
      The pattern is normally only matched against the process name. When -f is set, the full command line is used. 

теперь ваш pkill ищет любую командную строку в списке запущенных процессов, которые так или иначе содержит выражение «script.sh» и в конце концов обнаружат, что линия в каком-то момент. в результате его обнаружения он получит этот ПИД и прекратит его. к сожалению, тот же самый PID удерживает остальную часть вас в цепочке команд, которую просто убил сам.

так что вы в основном писали «строку самоубийств команд»;) Кстати: я просто сделал то же самое сегодня, и вот как я нашел ваш вопрос.

надеюсь, что это ответ помогает, даже если речь идет о немного поздно

вид касается

1

Ран в эту проблему сегодня, и просто хотел отправить рабочий пример для тех, кто работать в этом:

pkill -f ^'python3 /Scripts/script.py' > /dev/null 2>&1 ; python3 /Scripts/script.py > /tmp/script.log 2>&1 

Выполняется pkill и выполняет поиск по всей команде (-f), которая начинается с (regex ^) python3 /Scripts/script.py. Таким образом, он никогда не убьет себя, потому что он не начинается с этой команды (начинается с pkill).

0

3.141592 и ответ nanananananananananananaBATMAN правильный. Я работал над этой проблемой, как это.

00 22 * * 1-5 pkill -f script.[s][h] >log 2>&1 ; rm lock >log 2>&1

Это работает, потому что script.[s][h] (строка) не совпадают с script.[s][h] (регулярным выражением).

+0

Эта работа вокруг не нужна на моем macOS. Вероятно, 'pkill' на mac убивает процессы, кроме самого себя. – mercy387