„Polecenie nie znaleziono” podczas uruchamiania skryptu przez cron

29

Chcę uruchomić skrypt w crontab, ale mam pewne problemy ...

W moim skrypcie uruchamiam to polecenie:

db2 connect to myDB2

Działa to dobrze, gdy uruchamiam to jako użytkownik db2inst1 , ale kiedy uruchamiam ten skrypt w pliku crontab db2inst1 , otrzymuję:

db2: nie znaleziono polecenia.

Jak mogę to rozwiązać?

Wolfy
źródło

Odpowiedzi:

43

Aby uniknąć konieczności wpisywania bezwzględnej ścieżki do polecenia, powłoki wprowadziły $PATHzmienną środowiskową, każdy katalog jest oddzielony znakiem :a, a wyszukiwanie odbywa się od lewej do prawej. cronczęsto usuwa całe środowisko, w tym tę $PATHzmienną. Dlatego skrypt może zachowywać się inaczej w twoim cronie niż zachowanie w powłoce.

Użyj ścieżek bezwzględnych

Uruchom which db2jako db2inst1użytkownik, aby uzyskać pełną ścieżkę do db2programu. Jeśli wynikiem jest /usr/bin/db2, twoje polecenie cron wyglądałoby następująco:

/usr/bin/db2 connect to myDB2

Ustaw zmienną PATH

Uruchom echo "$PATH"jako db2inst1użytkownik, aby uzyskać $PATHzmienną i upewnij się, że ta zmienna jest również dostępna w skrypcie cron. Na przykład, jeśli wynik /usr/local/bin:/usr/bin:/binbyłby, umieść następny wiersz w górnej części skryptu powłoki:

export PATH="/usr/local/bin:/usr/bin:/bin"
Lekensteyn
źródło
8

Jak odpowiedział na /ubuntu//a/23438/227839 , powinieneś ustawić PATHw skrypcie powłoki:

#!/bin/bash
PATH="/usr/local/bin:/usr/bin:/bin"

# rest of script follows

lub w pliku crontab, który będzie miał zastosowanie do wszystkich zadań cron:

PATH="/usr/local/bin:/usr/bin:/bin"
0 1 * * * db2 connect to myDB2
Tama Linh
źródło
Dziękuję, to było pomocne!
Yamashiro Rion
3

Musisz zdefiniować, czym są db2 i myDB2 , w przeciwnym razie użyj bezwzględnej lokalizacji „ pliku ” lub „ aplikacji ”, które chcesz uruchomić.

Przykład:

/bin/rm /home/ubuntu/a.txt
Mahmudin Ashar
źródło