Eu tenho um script no OS X que parece em um determinado diretório para o arquivo com o mtime mais recente, vê se é (passado) um determinado tamanho e, em caso afirmativo, cria uma caixa de diálogo AppleScript + repete um invocação do comando say
até que a caixa de diálogo seja fechada. Eu verifiquei que este script funciona para qualquer diretório, incluindo o diretório em que estou interessado. No entanto, ele parece funcionar corretamente quando eu o executo a partir de um shell interativo (ou seja, via zsh no Terminal.app, xterm, etc ou Eshell no Emacs). Veja, quando executo o script como um cronjob, tudo o que ele faz é executar a invocação say
no script uma vez; nenhuma caixa de diálogo e nenhuma repetição de say
até que a caixa seja fechada, que é o que espero fazer. No entanto, não estou recebendo mensagens de erro no meu mail
, então parece que cron
acha que tudo está indo bem.
A maneira que eu tenho o cronjob configurado é assim:
SHELL=/bin/zsh
*/1 * * * * . $HOME/.zshrc && ps caux | grep -iq my_script && : || $HOME/bin/my_script /some/dir
Tradução: ele é executado a cada minuto, primeiro obtendo ~/.zshrc
(para definir variáveis de ambiente como $PATH
et al.). Em seguida, ele executa ps caux
, procurando o nome do processo do meu script e, se uma correspondência for encontrada, não será ativada. Caso contrário, execute meu script, segmentando /some/dir
. A verificação para ver se meu processo está em execução é feita para garantir que nenhuma ocorrência sobreposta ocorra e verifiquei também se isso funciona corretamente.
Então, quando executo o código desse cronjob em um terminal, tudo funciona bem. No entanto, como explicado anteriormente, algo está fazendo com que o próprio cronjob não seja executado como esperado. Quando consultei o Google sobre esse tipo de problema, encontrei essa pergunta no SO que parece espelhar meu problema, mas no Linux . Eu tentei a resposta aceita lá, que afirma tentar iniciar o trabalho via xterm
. Ou seja:
*/1 * * * * . $HOME/.zshrc && xterm -e ps caux | grep -iq my_script && : || $HOME/bin/my_script /some/dir
No entanto, isso foi em vão. Novamente, executar o código para este cronjob por meio de um shell interativo funcionou conforme o esperado, mas cron
ainda executou o script de forma peculiar, com a única diferença sendo que uma janela xterm
apareceu por uma fração de segundo a cada minuto.
Estou confuso sobre o motivo pelo qual isso está acontecendo e gostaria que o script funcionasse da mesma forma quando executado a partir de um shell interativo. Como posso realizar isso e por que o cron
está executando o script de maneira inesperada?