Mam zadanie crona, które uruchamia skrypt. Kiedy uruchamiam skrypt za pomocą interaktywnej powłoki (ssh'ed to bash), działa dobrze. Gdy skrypt uruchamia się sam przez crona, kończy się niepowodzeniem.
Domyślam się, że używa niektórych zmiennych środowiskowych ustawionych w interaktywnej powłoce. Mam zamiar rozwiązać problem skryptu i usunąć je.
Po wprowadzeniu zmian wiem, że mogę ustawić w kolejce skrypt w cronie, aby uruchomił się tak, jak normalnie, ale czy istnieje sposób, w jaki mogę uruchomić skrypt z wiersza poleceń, ale powiedzieć mu, aby uruchomił się tak jak z crona - tj. w środowisku nieinteraktywnym?
unset
.env
i możesz spróbowaćenv -i ./my-script.sh
. Ponadto pojawia się komunikat o błędzie?Odpowiedzi:
Główne różnice między uruchomieniem polecenia z crona a uruchomieniem w wierszu polecenia to:
/bin/sh
);cron(8)
lubcrontab(5)
man; generalnie jest tylkoHOME
, byćSHELL
możeLOGNAME
, i możeUSER
małyPATH
);%
znak specjalnie (jest on przekształcany w nowy wiersz);Poniższe wywołanie uruchomi fragment powłoki prawie tak, jakby został wywołany z crona. Zakładam, że fragment nie zawiera znaków
'
lub%
.Zobacz także wykonywanie skryptu sh z crona , co może pomóc rozwiązać problem.
źródło
sudo -u user /path/to/script
byłoby sposobem na uruchomienie go bez żadnych zmiennych?sudo
usuwa niektóre zmienne i ustawia inne na znaną wartość, ale to zależy od tego, jak jest skonfigurowana. Często jest skonfigurowany, aby zachować ustawienia regionalne iTERM
na przykład.Z linku @ sr_ ( Jak uzyskać czyste środowisko w powłoce ksh? ), Sprawdziłem env i możesz spróbować tego:
źródło
echo -e '#!/bin/bash -i\necho interactive $-' > ~/test.sh && chmod +x ~/test.sh && env -i ~/test.sh
wyjściainteractive himB
.Sugerowałbym, abyś używał bezwzględnych ścieżek dla swoich skryptów, kiedy umieszczasz go w cronie i używasz gdzie indziej oraz dla wszystkich używanych w nim komend linuxowych, lepiej zadeklaruj je jako zmienne i użyj ich!
źródło
Cron niekoniecznie używa tej samej powłoki, której używasz. czek:
Aby określić powłokę i tam spróbować wykonać skrypt - czy to działa? Jest to częsta przyczyna problemów wielu osób dodających skrypty do crona.
Jeśli to jest problem - możesz dodać „bash” na początku skryptu w cronie, aby wymusić wykonanie tego skryptu w bash. Jeśli to nie rozwiąże problemu, daj mi znać, a zagłębię się trochę głębiej.
źródło
Jeśli chcesz zignorować niektóre interaktywne pytania dostarczone przez jakiś skrypt, możesz spróbować:
Lub
yes "n"
jeśli chcesz Nie wszystkie pytania.źródło
Aby uruchomić skrypt w nieinteraktywnej powłoce (nie dotyczy to szczegółów
cron
), możesz to zrobić za pośrednictwemssh
.Sprawdź, czy naprawdę skończysz w nieinteraktywnej powłoce:
Uruchom skrypt w nieinteraktywnej powłoce:
źródło