Comando após ponto e vírgula não executado no Crontab?

0

Aqui está o meu crontab:

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

E de acordo com /var/log/cronele correu:

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

E o processo de MyExecutable.exemorreu. No entanto, here.lognão foi criado /tmp.

Se eu o executar manualmente em myuser:

touch /tmp/here.log

o arquivo foi criado com sucesso (portanto, não há problema de permissão, com certeza). Eu até tentei mudar touchpara um cronjob separado no crontab, e funcionou.

Por que toucho ponto e vírgula não é executado?

HCSF
fonte
É possível que touchnão esteja no caminho crontab padrão ( /usr/bin)?
22718 harrymc
Nah, está lá. Eu até tentei mudar o toque para um cronjob separado no crontab, e funcionou.
HCSF
O que acontece se você colocar os dois comandos entre parênteses?
Harrymc # 22/18
como 42 17 * * 1-5 (/ bin / pkill -f 'MyExecutable.exe'; toque em /tmp/here.log)?
HCSF
Sim, tente assim.
Harrymc # 22/18

Respostas:

1

Esta questão está relacionada com esta:

Executando dois comandos sequencialmente em um trabalho cron?

Você deve separar os dois comandos com &&, em vez de;

j1b3
fonte
Acredito que o && seja usado se o usuário realmente quiser executar o segundo comando após o primeiro ter sucesso. No entanto, um usuário pode querer executar o segundo comando, independentemente de o primeiro comando ser bem-sucedido.
HCSF
1

Isso pode ser replicado por

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

O Cron executa seu comando passando-o para um shell ( shou outro), de modo que é muito semelhante à linha acima. Independentemente de MyExecutable.exeexecutar ou não, ele pkill -fcombina (também) com o shell e o mata antes de executar touch. Isto é porque

Normalmente, o padrão é comparado apenas com o nome do processo. Quando -fdefinido, a linha de comando completa é usada.

(fonte man 1 pkill:)

Soluções possíveis:

  1. Se você não precisar -f, basta soltá-lo:

    42 17 * * 1-5 /bin/pkill 'MyExecutable.exe' ;  touch /tmp/here.log
    
  2. Se você precisar -f, execute touchantes pkill:

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