S největší pravděpodobností cron běží ve velmi řídkém prostředí. Zkontrolujte proměnné prostředí, které cron používá, přidáním fiktivní úlohy, která vypíše env
do souboru, jako je tento:
* * * * * env > env_dump.txt
Porovnejte to s výstupem env
v normální relaci shellu.
K místnímu crontab můžete přidat své vlastní proměnné prostředí tak, že je definujete v horní části crontab.
Zde je rychlá oprava pro přidání $PATH
na aktuální crontab:
# echo PATH=$PATH > tmp.cron
# echo >> tmp.cron
# crontab -l >> tmp.cron
# crontab tmp.cron
Výsledný crontab bude vypadat podobně jako odpověď chrissygormley, s PATH definovanou před pravidly crontab.
Do crontab
byste měli uvést úplné cesty . To je nejbezpečnější možnost.
Pokud to nechcete dělat, můžete kolem svých programů umístit obalový skript a nastavit tam PATH.
např.
01 01 * * * command
se stává:
01 01 * * * /full/path/to/command
Také cokoli volaného z cron
by měl být velmi opatrný na programy, které spouští, a pravděpodobně nastavit vlastní volbu pro PATH
proměnná.
EDIT:
Pokud nevíte, kde je příkaz, který chcete spustit which <command>
z vaší skořápky a řekne vám cestu.
EDIT2:
Takže jakmile váš program běží, první věc, kterou by měl udělat, je nastavit PATH
a jakékoli další požadované proměnné (např. LD_LIBRARY_PATH
) na hodnoty, které jsou nutné pro spuštění skriptu.
V podstatě místo přemýšlení o tom, jak upravit prostředí cronu, aby bylo vhodnější pro váš program/skript – udělejte ze svého skriptu prostředí, které mu je dáno, nastavením vhodného při spuštění.
Použil jsem /etc/crontab
. Použil jsem vi
a zadal do tohoto souboru cesty, které jsem potřeboval, a spustil jej jako root. Normální crontab přepíše PATH, které jste nastavili. Dobrý návod, jak to udělat.
Soubor cronu pro celý systém vypadá takto:
This has the username field, as used by /etc/crontab.
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file.
# This file also has a username field, that none of the other crontabs do.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# m h dom mon dow user command
42 6 * * * root run-parts --report /etc/cron.daily
47 6 * * 7 root run-parts --report /etc/cron.weekly
52 6 1 * * root run-parts --report /etc/cron.monthly
01 01 * * 1-5 root python /path/to/file.py