2015-06-30 10 views
6

TLDR; Có thể tạo một công việc cron chạy dịch vụ service_namebắt đầu? Làm sao?Có thể sử dụng "bắt đầu dịch vụ" mới nổi trong một công việc định kỳ không?

Nội dung của tôi

sudo crontab -e 

là:

45 23 * * * service bormarise_celery_daemon start 

này chạy bình thường trên thiết bị đầu cuối như là người chủ hoặc máy chủ:

service bormarise_celery_daemon start 
start: Job is already running: bormarise_celery_daemon 

Nhưng cron cho các lỗi sau thay vì:

bormarise_celery_daemon: unrecognized service 

Trả lời

10

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:

  1. 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.
  2. Nếu có, tập lệnh service sẽ kiểm tra xem nó có thể chạy initctl hay không.
  3. 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//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 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 
+0

grep -q with || rất thông minh. TIL. Cảm ơn bạn! – Irvan

Các vấn đề liên quan