Składnia Crontab; Wiele poleceń


14

Chciałbym uzyskać następujący łańcuch poleceń jako cronjob:

* * * * * source activate myenv3 && cd ~/foo/bar && python sssb.py

Działa w konsoli, ale nie otrzymuję żadnych danych wyjściowych z cronjob.

Zastosowałem się do tej sugestii, zastępując ją

* * * * * env > /tmp/env.output

aby dowiedzieć się, czy env jest inny. Nie mogłem znaleźć nic istotnego poza tym, że PATH jest inny. Więc wtedy ustawiłem

PATH=myPath
* * * * * source activate myenv3 && cd ~/foo/bar && python sssb.py

i nadal nie działało. W końcu zastąpiłem go

PATH=myPath
* * * * * source activate myenv3 && cd ~/foo/bar && python sssb.py
* * * * * env > /tmp/env.output

i tym razem nawet nie dostałem env.outputpliku. Dlatego myślę, że coś jest nie tak z moją składnią - ale wygląda dokładnie tak, jak sugestie dotyczące wielu poleceń, które znalazłem w Internecie.

Co tu się dzieje? Jeśli nie jest to oczywiste, co mogę dalej wykryć błąd?

PATH=/usr/local/anaconda2/envs/myenv3/bin:~/.conda:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

out.err:

/bin/sh: 6: /usr/local/anaconda2/envs/myenv3/bin/activate: [[: not found
/bin/sh: 15: /usr/local/anaconda2/envs/myenv3/bin/activate: [[: not found
/bin/sh: 17: /usr/local/anaconda2/envs/myenv3/bin/activate: [[: not found
Only bash and zsh are supported

Odpowiedzi:


16

W Ubuntu domyślnie crondemon uruchamia wszystkie zadania za pomocą powłoki sh( dash) i dashnie ma sourcewbudowanego.

Musisz użyć sposobu POSIX, tj . .:

* * * * * . activate myenv3 && cd ~/foo/bar && python sssb.py

Alternatywnie możesz uruchomić zadanie jako argument do bash:

* * * * * "$(command -v bash)" -c 'source activate myenv3 && cd ~/foo/bar && python sssb.py'

Teraz znów mam plik /tmp/env.output, ale nadal nie mam danych wyjściowych z pliku głównego.
FooBar

1
@FooBar jaki jest wynik grep SHELL /tmp/env.output? * * * * * ( . activate myenv3 && cd ~/foo/bar && python sssb.py ) >/tmp/out.err 2>&1/tmp/out.err
Uruchom

Mówi SHELL = / bin / sh. Wkleję wynik out.erri rzeczywistą ŚCIEŻKĘ, którą wkleiłem do pytania.
FooBar

1
+1 za enkapsulację za pomocą $(command -v bash) -c ' ... '- rozwiązuje cały tigaboo bez wchodzenia w (nie tak) niechlujne szczegóły.
Cbhihe,

1
Polecenie -v część "$(command -v bash)" -c '...'jest bezcelowe. Po prostu zróbbash -c '...'
geirha
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.