Zaplanowałem, że moje zadanie będzie uruchamiane codziennie o 12:30 za pomocą tego polecenia:
30 12 * * * java -jar test.jar
Zgłasza błąd:
/bin/sh: 1: java: not found
Próbowałem uruchomić to polecenie: java -jar test.jar
z powłoki i działało dobrze.
Teraz nie rozumiem, powiedziałbym, że tak się dzieje, ponieważ JAVA_HOME
zmienna środowiskowa nie jest ustawiona, ale dlaczego działa z powłoki?
Odpowiedzi:
1 dla odpowiedzi № 1Błąd informuje, że powłoka nie mogła zlokalizować java
binarny do wykonania. To nie ma nic wspólnego z JAVA_HOME
zmienna środowiskowa, ale z PATH
zmienna, która jest konsultowana przez sh
znaleźć dowolne polecenie.
Po uruchomieniu zadania z cron
, powłoka nie otrzymała tej samej inicjalizacji, co twoja interaktywna powłoka, w której działa polecenie. Równie dobrze to znajdziesz JAVA_HOME
nie jest tam również ustawiony.
1 dla odpowiedzi nr 2
Twoje środowisko powłoki logowania różni się od tego, które posiada twój cronjob. Posługiwać się env
wydrukować swoje środowisko.
Sprawdź ścieżkę na obu - W cronie (coś podobnego)
30 08 * * * env > ~/cronenv
. W powłoce logowania po prostu użyj env
. Następnie porównaj zmienne PATH. Ponieważ @Marko Topolnik już stwierdził, że PATH w cronie oczywiście nie zawiera plików wykonywalnych java.
0 dla odpowiedzi № 3
Możesz dodać linię do pliku crontab, która zawiera ścieżkę, której potrzebujesz:
# m h dom mon dow command
PATH=.....
Prawdopodobnie potrzebujesz czegoś takiego:
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
Możesz także użyć echo $PATH
aby dowiedzieć się, co masz w swoim normalnym środowisku i po prostu użyć tej wartości.