Mam skrypt, który działa, gdy uruchamiam go z wiersza poleceń, ale kiedy go cron
planuję, otrzymuję błędy, że nie może znaleźć plików ani poleceń. Moje pytanie jest dwojakie:
Czy podczas planowania zadania cron używa
crontab -e
on mojego ID użytkownika jako podstawy dla jego uprawnień? Czy też używa jakiegoś rodzaju identyfikatora użytkownika cron i powiązanych uprawnień?Po uruchomieniu zadania cron, jaki jest katalog roboczy? Czy to katalog, w którym określam skrypt do uruchomienia, czy inny katalog?
Oto moja praca Crona:
15 7 * * * /home/xxxx/Documents/Scripts/email_ip_script.sh
Oto rzeczywisty skrypt:
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
Oto błędy, które otrzymuję, gdy przeglądam mail
komunikat wyprodukowany przez 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
Nie można go znaleźć, template.txt
ale znajduje się w tym samym katalogu co skrypt. To także nie może działać ssmtp
, ale mogę jako mój użytkownik. Czego mi brakuje, żeby to działało poprawnie?
źródło
cron
to będzie własne,PATH
czy mogę sprawdzić mojego użytkownikaPATH
? Skonfigurowałem ssmtp, aby miał swój własnyuser
iwheel
pozwolenie, myśląc, że pozwoli każdemu go używać (w tym cronowi). Jeśli to pomoże im w CENTOS 6.2ssmtp
, ale na tym, że twoje zadanie cron nie znajduje żadnego pliku wykonywalnego,ssmtp
ponieważ nie ma go w twoimPATH
. Nie ma czegoś takiego jak „twój użytkownikPATH
”; jest to ustawienie na proces, a nie na użytkownika. Możesz ustawić ścieżkę dla wszystkich zadań crona, umieszczającPATH=…
linię w swoim crontabie.´which ssmtp´ ...
type ssmtp
Jeśli twój cronjob jest skryptem bashowym, poniższe CD zapisze lokalizację jego skryptu (zakładając, że używasz ścieżki bezwzględnej w definicji crona):
źródło
Aby odpowiedzieć na pytanie 1: jeśli uruchomisz
crontab -e
jako własny użytkownik, zadania będą zaplanowane w crontab tego użytkownika, a zatem będą działać z uprawnieniami tego użytkownika.Musisz jednak wziąć pod uwagę, że zadania będą działać w nieinteraktywnej powłoce, co oznacza, że $ PATH może różnić się od tej, którą masz podczas uruchamiania skryptu z wiersza poleceń.
Najlepiej zawsze używać pełnych ścieżek w skryptach, zwłaszcza jeśli planujesz je zaplanować za pomocą at / cron itp.
Polecam również stosowanie pełnych ścieżek do wszystkich plików, aby uniknąć dokładnie problemów, które widzisz.
Aby zapobiec warunkom wyścigu i innym problemom bezpieczeństwa, powinieneś również
mktemp
upewnić się, że czytany plik nie jest modyfikowany przez nic poza skryptem.Więc zmieniłbym skrypt na coś takiego:
źródło
cron
uruchamia zaplanowane zadania każdego użytkownika jako tego użytkownika. To powinno wystarczyć, abyśmy zorientowali się, że uruchamia twoje skrypty względem twojego katalogu domowego.Jeśli potrzebujesz go uruchomić z innej lokalizacji, po prostu użyj
cd
w skrypcie, aby przejść do tej lokalizacji.ssmtp
prawdopodobnie niecron
jest domyślną ŚCIEŻKĄ (z założenia jest bardzo wąska na większości platform). Możesz albo podać pełną ścieżkę dossmtp
skryptu, albo jawnie ustawić PATH w a) pliku crontab, który będzie dostępny dla wszystkich twoich skryptów, lub b) w każdym skrypcie.źródło
Sprawdź ten wątek, w jaki sposób możesz łatwo dowiedzieć się, jakie jest środowisko crona, jest o wiele mniej niż przyzwyczajone w interaktywnej powłoce. Najlepiej jest założyć, że nic nie zostało ustawione i jawnie ustawić to samodzielnie.
źródło
Domyślnym katalogiem roboczym do
cron
wykonywania zadania jest zazwyczaj katalog domowy/home/your-user-name
.Przyjęcie @Kusalananda doskonałego komentarza.
źródło
/home
jest daleki od uniwersalności./home
./Users
i historyczne użycie Unices/usr
, a nawet w systemie Linux katalog domowy użytkownika systemu może znajdować się gdzieś pod/var
lub gdzie indziej.Niektóre osoby sugerowały lub łączyły się z tym, ale najlepszym sposobem, aby się tego dowiedzieć, ponieważ nie mogę tego znaleźć w dokumentacji dla mojego dystrybucji, jest dodanie tego do crona
W moim przypadku ubuntu domyślnie używa tylko tego,
/usr/bin:/bin
co spowodowało kilka problemów.źródło