O que é o 'diretório de trabalho' quando o cron executa um trabalho?

142

Eu tenho um script que funciona quando eu o executo a partir da linha de comando, mas quando eu programo com cron eu recebo erros que ele não consegue encontrar arquivos ou comandos. Minha pergunta é dupla:

  1. Quando eu programo uma tarefa cron usando crontab -e , ela usa meu ID de usuário como base para suas permissões? Ou usa um ID de usuário do cron de algum tipo e suas permissões relacionadas?

  2. Quando um trabalho cron é iniciado, qual é o diretório de trabalho? É o diretório onde especifico o script a ser executado ou um diretório diferente?

Aqui está meu trabalho no cron:

15 7 * * * /home/xxxx/Documents/Scripts/email_ip_script.sh

Aqui está o script real:

vIP_ADDR="'curl automation.whatismyip.com/n09230945.asp'"
echo "$vIP_ADDR"
sed "s/IPADDR/$vIP_ADDR/g" template.txt > emailmsg.txt
ssmtp [email protected] < emailmsg.txt

Aqui estão os erros que recebo quando vejo a mensagem mail produzida por cron :

sed: can't read template.txt: No such file or directory
/home/xxxx/Documents/Scripts/email_ip_script.sh: line 15: ssmtp: command not found

Não é possível encontrar o template.txt , mas ele reside no mesmo diretório do script. Ele também não pode executar ssmtp , mas posso como meu usuário. O que estou perdendo para que isso funcione corretamente?

    
por ProfessionalAmateur 18.05.2012 / 17:34

7 respostas

127

Adicione cd /home/xxxx/Documents/Scripts/ se quiser que seu trabalho seja executado nesse diretório. Não há razão para o cron mudar para esse diretório específico. Cron executa seus comandos em seu diretório inicial.

Quanto a ssmtp , pode não estar em seu padrão PATH . O caminho padrão do Cron depende da implementação, portanto, verifique sua página do manual, mas é muito provável que ssmtp esteja em /usr/sbin , que não está no seu padrão PATH , apenas em root.

PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin
15 7 * * * cd /home/xxxx/Documents/Scripts && ./email_ip_script.sh
    
por 18.05.2012 / 17:45
17

Se o seu cronjob é um script bash, o seguinte CD irá para a localização do seu script (assumindo que você está usando o caminho absoluto na sua definição cron):

cd "$(dirname "$0")";
    
por 08.11.2016 / 11:55
13

Para responder à pergunta 1: se você executar crontab -e como seu próprio usuário, os trabalhos serão agendados no crontab desse usuário e, portanto, serão executados com as permissões desse usuário.

Mas você precisa considerar que os trabalhos serão executados em um shell não interativo, o que significa que o $ PATH pode ser diferente daquele que você possui ao executar o script a partir da linha de comando.

É melhor sempre usar caminhos completos em scripts, especialmente se você planeja agendá-los via / cron etc.

Também recomendo usar caminhos completos para todos os arquivos para evitar exatamente os problemas que você vê.

Para evitar condições de corrida e outros problemas de segurança, você também deve usar mktemp para garantir que o arquivo lido não seja modificado por nada fora do script.

Então eu alteraria o script para algo como:

vIP_ADDR="'curl automation.whatismyip.com/n09230945.asp'"
echo "$vIP_ADDR"
mail_msg='/bin/mktemp'
/bin/sed "s/IPADDR/$vIP_ADDR/g" /home/xxxx/Documents/Scripts/template.txt > $mailmsg
/path/to/ssmtp [email protected] < $mailmsg
/bin/rm $mailmsg
    
por 18.05.2012 / 17:58
7

cron executa os trabalhos agendados de cada usuário como esse usuário. Isso deve ser o suficiente para que possamos descobrir que ele executa seus scripts em relação ao seu diretório pessoal.

Se você precisar que ele seja executado em um local diferente, basta usar cd em seu script para ir para esse local.

ssmtp provavelmente não está no PATH padrão de cron (ele está configurado para ser muito estreito por design na maioria das plataformas). Você pode especificar o caminho completo para ssmtp em seu script ou pode definir explicitamente PATH em a) seu arquivo crontab, que estará disponível para todos os seus scripts, ou b) em cada script.

    
por 18.05.2012 / 17:53
2

Verifique se este tópico como você pode facilmente descobrir o ambiente do cron, é muito menos do que você está acostumado em um shell interativo. O melhor é assumir que nada foi definido e definir explicitamente você mesmo.

    
por 19.05.2012 / 00:52
0

Algumas pessoas sugeriram ou ligaram, mas a melhor maneira de descobrir, já que não consigo encontrá-lo na documentação do homem para a minha distribuição, é simplesmente adicionar isso a um cron

* * * * * echo $PATH > /tmp/lolcronjobs

No meu caso, o ubuntu usa apenas /usr/bin:/bin , o que causou alguns problemas.

    
por 09.11.2017 / 18:01
0

O diretório de trabalho padrão para cron na execução da tarefa é o diretório inicial, normalmente /home/your-user-name .

Adotando o excelente comentário @Kusalananda.

    
por 06.03.2018 / 10:28