Cú pháp Crontab; Nhiều lệnh


13

Tôi muốn nhận chuỗi lệnh sau dưới dạng cronjob:

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

Nó hoạt động trong giao diện điều khiển, nhưng tôi không nhận được bất kỳ đầu ra nào từ cronjob.

Tôi đã làm theo gợi ý này , bằng cách thay thế nó bằng

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

để tìm hiểu xem env có khác không. Tôi không thể tìm thấy bất cứ điều gì có liên quan ngoài PATH là khác nhau. Vì vậy, sau đó tôi thiết lập

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

và nó vẫn không hoạt động. Cuối cùng tôi đã thay thế nó bằng

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

và lần này tôi thậm chí không nhận được env.outputtập tin. Do đó tôi nghĩ có gì đó không đúng với cú pháp của tôi - nhưng nó trông giống hệt như các đề xuất đa lệnh tôi tìm thấy trên mạng.

Những gì đang xảy ra ở đây? Nếu nó không rõ ràng, tôi có thể làm gì tiếp theo để tìm ra lỗi?

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

Câu trả lời:


16

Trong Ubuntu, theo mặc định, crontrình nền chạy tất cả các công việc bằng cách sử dụng shell sh( dash) và dashkhông có sourcenội dung.

Bạn cần sử dụng cách POSIX tức là .:

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

Thay phiên, bạn có thể chạy công việc như một đối số để bash:

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

Bây giờ tôi có tệp /tmp/env.output một lần nữa, nhưng vẫn không có đầu ra từ tệp chính.
FooBar

1
@FooBar đầu ra của grep SHELL /tmp/env.outputcái gì? Đồng thời chạy công việc đầu tiên * * * * * ( . activate myenv3 && cd ~/foo/bar && python sssb.py ) >/tmp/out.err 2>&1và kiểm tra nội dung của/tmp/out.err
heemayl

Nó nói SHELL = / bin / sh. Tôi sẽ dán kết quả đầu ra out.errvà PATH thực tế mà tôi đã dán vào câu hỏi.
FooBar

1
+1 cho việc đóng gói của bạn bằng cách sử dụng $(command -v bash) -c ' ... '- giải quyết toàn bộ tigaboo w / o đi vào các chi tiết lộn xộn (không phải vậy).
Cbhihe

1
Phần lệnh -v của "$(command -v bash)" -c '...'là vô nghĩa. Chỉ cần làmbash -c '...'
geirha
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.