tl; dr
Bạn cần phải thêm /sbin
để cron của PATH
vì vậy kịch bản service
có thể tìm thấy initctl
. Để làm điều đó, thêm một định nghĩa như thế này để phía trên cùng của crontab của bạn:
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
Bạn vẫn có thể chạy vào các vấn đề với cron
gửi email cho bạn kể từ initctl
thoát với tình trạng 1 (thất bại) nếu công việc bạn cố gắng để bắt đầu là đã chạy. Bạn có thể giải quyết vấn đề đó với một cái gì đó như:
45 23 * * * service bormarise_celery_daemon status | grep -q running || service bormarise_celery_daemon start
Mặc dù hơi dài, chỉ nên chạy lệnh bắt đầu nếu dịch vụ bormarise_celery_daemon
không chạy.
dịch vụ vs initctl
Trong khi lệnh service
làm cho một nỗ lực để quản lý công việc Upstart, nó không phải là chức năng điều khiển Upstart thực tế - đó sẽ là initctl
và các bộ có liên quan của các lệnh ngắn tay (tức , start
, stop
, , v.v.). Tất cả các tập lệnh Upstart đều nằm trong số /sbin/
.
Lệnh service
cố gắng tạo điều kiện thuận lợi cho mọi người phân phối dịch vụ giữa cả tập lệnh kiểu Khởi động và kiểu SysV cổ điển. Bằng cách đó bạn có thể sử dụng một giao diện (tập lệnh service
) để quản lý các dịch vụ từ cả hai hệ thống.
Delving vào dịch vụ Script
Nếu bạn duyệt nguồn thực tế của service
kịch bản (nó chỉ là một kịch bản Bash) trên Ubuntu 14.04, bạn sẽ thấy:
if [ -r "/etc/init/${SERVICE}.conf" ] && which initctl >/dev/null \
&& initctl version | grep -q upstart
then
# Upstart configuration exists for this job and we're running on upstart
case "${ACTION}" in
start|stop|status|reload)
# Action is a valid upstart action
exec ${ACTION} ${SERVICE} ${OPTIONS}
;;
restart)
# Map restart to the usual sysvinit behavior.
stop ${SERVICE} ${OPTIONS} || :
exec start ${SERVICE} ${OPTIONS}
;;
force-reload)
# Upstart just uses reload for force-reload
exec reload ${SERVICE} ${OPTIONS}
;;
esac
fi
Việc mở có điều kiện:
- Kiểm tra xem dịch vụ bạn đã chỉ định (trong trường hợp của bạn:
bormarise_celery_daemon
) là công việc Mới nổi.Công việc mới nổi bắt đầu vào /etc/init/
với tiện ích mở rộng .conf
.
- Nếu có, tập lệnh
service
sẽ kiểm tra xem nó có thể chạy initctl
hay không.
- Nếu có thể, đoạn mã
service
sau đó sẽ đảm bảo rằng initctl
là phiên bản đủ mới.
Nếu tất cả điều đó là sự thật, sau đó kịch bản service
sẽ cố gắng sử dụng các lệnh thích hợp initctl
để chạy công việc Upstart. Ví dụ:
service bormarise_celery_daemon start
chuyển thành:
start bormarise_celery_daemon
đó là (cơ bản) tương đương với:
initctl start bormarise_celery_daemon
Tuy nhiên, nếu bất kỳ của những điều kiện là không đúng sự thật, các service
script giả sử bạn đang cố chạy một kịch bản kiểu SysV. Đây chỉ là các tập lệnh Bash nằm trong số /etc/init.d/
. Tuy nhiên, nếu không có tập lệnh như vậy tồn tại, nó sẽ thoát ra với thông báo lỗi unrecognized service
.
Đưa miếng Cùng
Giá trị mặc định PATH
cho cron chỉ chứa /bin/
và /usr/bin/
. Điều này có nghĩa là nó không bao gồm /sbin/
là nơi thực thi initctl
. Điều này có nghĩa là cron
sẽ không thể chạy initctl
.
Khi cron
chạy crontab của bạn, service
kịch bản là thể tìm thấy công việc Upstart của bạn, nhưng nó là không thể chạy lệnh initctl
, vì vậy nó bỏ qua trên cố gắng để chạy dịch vụ của bạn thông qua Upstart (tức là, initctl
). Thay vào đó, nó sau đó cố gắng tìm kiếm một kịch bản kiểu SysV trong /etc/init.d/
. Vì tập lệnh đó không tồn tại, tập lệnh service
sẽ từ bỏ và in thông báo lỗi của bạn.
Nếu bạn ghi đè cron
's mặc định PATH
với một bao gồm /sbin/
, sau đó kịch bản service
sẽ có thể tìm thấy initctl
và sẽ cố gắng để khởi động công việc Upstart của bạn.
Điều thú vị là trên Ubuntu 12.04 kịch bản service
chỉ kiểm tra để xem nếu một công việc Upstart tồn tại, bỏ qua cả initctl
kiểm tra. Điều đó có nghĩa là nếu bạn đang thử điều này trên Ubuntu 12.04, nó sẽ cố gắng sử dụng Upstart để bắt đầu dịch vụ của bạn. Tuy nhiên, nếu /sbin/
không có trên đường dẫn, nó sẽ không thành công với thông báo lỗi (hơi) dễ hiểu hơn:
/usr/bin/service: 123: exec: start: not found
grep -q with || rất thông minh. TIL. Cảm ơn bạn! – Irvan