Eu tenho um script que funciona quando o executo a partir da linha de comando, mas quando o agendamento cron
recebo erros que não conseguem encontrar arquivos ou comandos. Minha pergunta é dupla:
Quando agendar um trabalho cron usando
crontab -e
, ele usa meu ID de usuário como base para suas permissões? Ou ele usa um ID de usuário cron de algum tipo e suas permissões relacionadas?Quando um trabalho cron é iniciado, qual é o diretório de trabalho? É o diretório em que especifico o script a ser executado ou um diretório diferente?
Aqui está o meu trabalho 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 visualizo a mail
mensagem 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
Ele não pode encontrar o template.txt
mas reside no mesmo diretório que o script. Ele também não pode ser executado ssmtp
, mas eu posso como meu usuário. O que estou faltando para que isso funcione corretamente?
fonte
cron
ele próprioPATH
ou posso verificar o meu usuárioPATH
? Eu configurei o ssmtp para ter o seu própriouser
e awheel
permissão pensando que permitiria a qualquer um usá-lo (incluindo o cron). Se ajuda no Im CENTOS 6.2ssmtp
, mas que seu trabalho cron não encontra nenhum executável chamadossmtp
porque não está no seuPATH
. Não existe algo como "seu usuárioPATH
"; essa é uma configuração por processo, não por usuário. Você pode definir o caminho para todos os seus trabalhos cron colocando umaPATH=…
linha no seu crontab.´which ssmtp´ ...
type ssmtp
Se o seu cronjob for um script bash, o seguinte será um CD para o local do seu script (supondo que você esteja usando o caminho absoluto na sua definição cron):
fonte
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, 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 na linha de comando.
É melhor sempre usar caminhos completos em scripts, especialmente se você planeja agendá-los por meio de / cron etc.
Eu também recomendaria o uso de 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 que você lê não seja modificado por nada fora do seu script.Então, eu mudaria o script para algo como:
fonte
cron
executa os trabalhos agendados de cada usuário como esse usuário. Isso deve ser suficiente para concluirmos que ele executa seus scripts em relação ao diretório inicial.Se você precisar executar a partir de um local diferente, basta usar
cd
no seu script para ir para esse local.ssmtp
provavelmente não está nocron
PATH padrão (ele está definido para ser muito estreito por design na maioria das plataformas). Você pode especificar o caminho completo para ossmtp
seu script ou definir explicitamente PATH em a) seu arquivo crontab, que estará disponível para todos os seus scripts ou b) em cada script.fonte
Verifique neste tópico como você pode facilmente descobrir o ambiente do cron, é muito menor do que você está acostumado em um shell interativo. O melhor é supor que nada foi definido e defini-lo explicitamente.
fonte
O diretório de trabalho padrão para a
cron
execução do trabalho é o diretório inicial, normalmente/home/your-user-name
.Adotando @Kusalananda excelente comentário.
fonte
/home
está longe de ser universal./home
./Users
e o histórico do Unices usa/usr
, e mesmo no Linux, o diretório inicial de um usuário do sistema pode estar em algum lugar abaixo/var
ou em outro lugar.Algumas pessoas têm sugerido ou vinculado a ele, mas a melhor maneira de descobrir, já que eu não consigo encontrá-lo nos documentos do homem para minha distribuição, basta adicioná-lo a um cron
No meu caso, o ubuntu usa como padrão apenas o
/usr/bin:/bin
que causou alguns problemas.fonte