Вот мой 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 после запуска точки с запятой?

2 ответа2

1

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

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .