Czy uruchomić skrypt w nieinteraktywnej powłoce?

17

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?

cwd
źródło
Powiązane i dlatego być może pomocne: „Jak uzyskać czyste środowisko w powłoce ksh?” zobacz szczególnie odpowiedź @Gilles na temat unset.
sr_
1
Z linku @ sr_ podniosłem wzrok envi możesz spróbować env -i ./my-script.sh. Ponadto pojawia się komunikat o błędzie?
Kevin
Jakiej implementacji cron używasz?
rozcietrzewiacz
@kevin - głosuję za tym, jeśli odpowiesz.
cwd

Odpowiedzi:

12

Główne różnice między uruchomieniem polecenia z crona a uruchomieniem w wierszu polecenia to:

  • cron prawdopodobnie używa innej powłoki (ogólnie /bin/sh);
  • cron zdecydowanie działa w małym środowisku (które zależy od implementacji crona, więc sprawdź stronę cron(8)lub crontab(5)man; generalnie jest tylko HOME, być SHELLmoże LOGNAME, i może USERmały PATH);
  • cron traktuje %znak specjalnie (jest on przekształcany w nowy wiersz);
  • zadania cron działają bez terminala lub środowiska graficznego.

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 %.

env - HOME="$HOME" USER="$USER" PATH=/usr/bin:/bin /bin/sh -c 'shell snippet' </dev/null >job.log 2>&1

Zobacz także wykonywanie skryptu sh z crona , co może pomóc rozwiązać problem.

Gilles „SO- przestań być zły”
źródło
Cześć @Giles - właśnie o czymś pomyślałem - czy uruchomienie skryptu sudo -u user /path/to/scriptbyłoby sposobem na uruchomienie go bez żadnych zmiennych?
cwd
@cwd Nie, zwykle nie. sudousuwa 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 i TERMna przykład.
Gilles 'SO- przestać być zła'
2

Z linku @ sr_ ( Jak uzyskać czyste środowisko w powłoce ksh? ), Sprawdziłem env i możesz spróbować tego:

env -i ./my-script.sh
Kevin
źródło
Działa to dla mnie dobrze, chociaż odpowiedź @Gilles jest również bardzo dobra.
cwd
@cwd: Nie działa dla mnie: echo -e '#!/bin/bash -i\necho interactive $-' > ~/test.sh && chmod +x ~/test.sh && env -i ~/test.shwyjścia interactive himB.
Alix Axel,
1

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!

Gaumire
źródło
tak. ale oczywiście.
cwd
0

Cron niekoniecznie używa tej samej powłoki, której używasz. czek:

cat /etc/crontab |grep SHELL

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.

Matt
źródło
0

Jeśli chcesz zignorować niektóre interaktywne pytania dostarczone przez jakiś skrypt, możesz spróbować:

yes | your_command

Lub yes "n"jeśli chcesz Nie wszystkie pytania.

Komenda:

tak - bądź powtarzalnie twierdzący, tak, wyjdź przekleństwem, lub domyślnie „y” na zawsze.

kenorb
źródło
0

Aby uruchomić skrypt w nieinteraktywnej powłoce (nie dotyczy to szczegółów cron), możesz to zrobić za pośrednictwem ssh.

Sprawdź, czy naprawdę skończysz w nieinteraktywnej powłoce:

> ssh someuser@somehost tty
not a tty

Uruchom skrypt w nieinteraktywnej powłoce:

> ssh someuser@somehost /tmp/myscript.sh
dokaspar
źródło