Команда после точки с запятой не выполняется в Crontab?

504
HCSF

Вот мой crontab:

42 17 * * 1-5 /bin/pkill -f 'MyExecutable.exe' ; touch /tmp/here.log 

И в соответствии с /var/log/cronэтим действительно запустить:

May 22 17:42:01 server1 CROND[326732]: (myuser) CMD (/bin/pkill -f 'MyExecutable.exe' ; touch /tmp/here.log) 

И процесс MyExecutable.exeумер. Тем here.logне менее, не был создан в /tmp.

Если я запускаю его вручную под myuser:

touch /tmp/here.log 

файл создан успешно (следовательно, не проблема разрешения точно). Я даже пытался перейти touchв отдельный cronjob в crontab, и это сработало.

Почему touchпосле запятой не запускается?

0
Возможно ли, что `touch` не находится в пути crontab по умолчанию (` / usr / bin`)? harrymc 5 лет назад 0
Нет, это там. Я даже пытался перенести touch в отдельный cronjob в crontab, и это сработало. HCSF 5 лет назад 0
Что произойдет, если вы заключите две команды в скобки? harrymc 5 лет назад 0
как 42 17 * * 1-5 (/ bin / pkill -f 'MyExecutable.exe'; коснитесь /tmp/here.log)? HCSF 5 лет назад 0
Да, попробуй так. harrymc 5 лет назад 0

2 ответа на вопрос

1
Kamil Maciorowski

Это может быть воспроизведено

sh -c 'pkill -f "MyExecutable.exe" ; touch /tmp/here.log' 

Cron запускает вашу команду, передавая ее в оболочку ( shили другую), поэтому она очень похожа на приведенную выше строку. Независимо от того, MyExecutable.exeзапускается ли он или нет, pkill -fсопоставляет (также) оболочку и убивает ее до того, как она запустится touch. Это потому что

Шаблон обычно сопоставляется только с именем процесса. Когда -fустановлено, используется полная командная строка.

(Источник: man 1 pkill)

Возможные решения:

  1. Если вам не нужно -f, просто бросьте его:

    42 17 * * 1-5 /bin/pkill 'MyExecutable.exe' ; touch /tmp/here.log 
  2. Если вам нужно -f, запустите touchперед pkill:

    42 17 * * 1-5 touch /tmp/here.log ; /bin/pkill -f 'MyExecutable.exe' 
0
j1b3

Этот вопрос связан с этим:

Запускать две команды последовательно в задании cron?

Вы должны разделить две команды с помощью && вместо;

Я считаю, что && используется, если пользователь действительно хочет запустить вторую команду после первой успешной. Однако пользователь может захотеть запустить вторую команду независимо от того, является ли первая команда успешной. HCSF 5 лет назад 0

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