it-swarm-eu.dev

Co je to „pracovní adresář“, když cron provádí úlohu?

Mám skript, který funguje, když jej spouštím z příkazového řádku, ale když jej naplánuji pomocí cron, dostanu chyby, že nemůže najít soubory nebo příkazy. Moje otázka je dvojí:

  1. Když naplánuji úlohu cron pomocí crontab -e, používá moje uživatelské ID jako základ pro svá oprávnění? Nebo používá ID uživatele cron nějakého druhu a související oprávnění?

  2. Když je spuštěna úloha cron, jaký je pracovní adresář? Je to adresář, do kterého určím skript, který se má spustit, nebo jiný adresář?

Tady je moje práce cron:

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

Zde je aktuální skript:

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

Zde jsou chyby, které dostanu při zobrazení zprávy mail vytvořené uživatelem 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

Nelze najít template.txt ale nachází se ve stejném adresáři jako skript. Nelze také spustit ssmtp, ale mohu jako můj uživatel. Co mi chybí, aby to fungovalo správně?

182

Přidat cd /home/xxxx/Documents/Scripts/, pokud chcete, aby vaše úloha byla spuštěna v tomto adresáři. Neexistuje žádný důvod, proč by se cron změnil na tento konkrétní adresář. Cron spouští vaše příkazy ve vašem domovském adresáři.

Pokud jde o ssmtp, nemusí to být ve vašem výchozím PATH. Výchozí cesta Cronu je závislá na implementaci, takže zkontrolujte svou manuálovou stránku, ale s největší pravděpodobností ssmtp je v /usr/sbin, která není ve výchozím nastavení PATH, pouze 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

Pokud je váš cronjob bash skriptem, následující CD na místo vašeho skriptu (za předpokladu, že používáte absolutní cestu v definici cronu):

cd "$(dirname "$0")";
25
Hugo

Odpověď na otázku 1: pokud spustíte crontab -e jako váš vlastní uživatel budou úlohy naplánovány v crontabu tohoto uživatele a budou tedy spuštěny s oprávněními tohoto uživatele.

Musíte však vzít v úvahu, že úlohy budou spuštěny v neinteraktivním prostředí Shell, což znamená, že $ PATH se může lišit od té, kterou máte při spuštění skriptu z příkazového řádku.

Nejlepší je vždy používat úplné cesty ve skriptech, zejména pokud je plánujete naplánovat na/cron atd.

Doporučuji také použít úplné cesty ke všem souborům, abyste se vyhnuli přesně problémům, které vidíte.

Abyste zabránili závodním podmínkám a dalším problémům se zabezpečením, měli byste také použít mktemp, abyste se ujistili, že čtený soubor není upraven ničím mimo skript.

Takže bych změnil skript na něco jako:

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
16
Bram

cron spustí naplánované úlohy každého uživatele jako tento uživatel. To by mělo stačit, abychom zjistili, že spouští vaše skripty ve vztahu k domovskému adresáři.

Pokud potřebujete spustit z jiného umístění, jednoduše použijte ve skriptu cd a přejděte na toto místo.

ssmtp pravděpodobně není ve výchozí PATH cron (na většině platforem je záměrně nastaven velmi úzce). Ve skriptu můžete buď zadat úplnou cestu k ssmtp, nebo můžete explicitně nastavit PATH v a) souboru crontab, který bude k dispozici pro všechny vaše skripty, nebo b) v každém skriptu.

7
D_Bye

Zkontrolujte toto vlákno, jak můžete snadno zjistit prostředí cronu, je to mnohem méně, než jste zvyklí v interaktivním prostředí. Nejlepší je předpokládat, že nic nebylo nastaveno a explicitně to nastavit sami.

3
jippie

Výchozí pracovní adresář pro cron při provádění úlohy je domovský adresář, obvykle /home/your-user-name.

Přijetí @ Kusalananda vynikající komentář.

Někteří lidé na to naráželi nebo na ně odkazovali, ale nejlepší způsob, jak to zjistit, protože to nemohu najít v mužských dokumentech pro mé distro, je prostě přidat do cronu

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

V mém případě je Ubuntu standardně nastaveno pouze pomocí /usr/bin:/bin což způsobilo několik problémů.

0
mschuett