Tại sao dịch vụ mới nhất của tôi bắt đầu khởi động hệ thống?


37

Tiếp theo câu hỏi này , tôi đã viết một dịch vụ khởi động đơn giản ( /etc/init/pms.conf ) cho hộp Ubuntu Server 11.04 không đầu của tôi như sau:

start on filesystem and net-device-up IFACE=eth0
stop on runlevel [016]
respawn

exec /home/administrator/pms-current/PMS.sh

Tôi có thể bắt đầu (hoặc dừng) dịch vụ này theo ý muốn từ dòng lệnh:

service pms start

Và tôi có thể thấy rằng nó thực sự đang chạy.

Tuy nhiên, khi tôi khởi động máy lần đầu tiên, dịch vụ không khởi động. Nếu tôi SSH vào hộp và kiểm tra trạng thái dịch vụ tôi nhận được:

$ service pms status
pms stop/waiting

Câu hỏi của tôi là tại sao điều này xảy ra? Tại sao dịch vụ của tôi không bắt đầu khởi động?

CẬP NHẬT 1 : không chắc chắn liệu dịch vụ của tôi đã được bắt đầu và sau đó sắp chết hay hoàn toàn không bắt đầu, tôi đã thêm phần sau vào PMS.sh:

echo "STARTED" > $STARTLOG

Điều này rõ ràng chỉ cho tôi một cái gì đó để tìm kiếm. Tôi đã thử nghiệm điều này bằng cách tự khởi động dịch vụ và sau đó kiểm tra start.log . Sau đó tôi đã xóa start.log và khởi động lại. Nó không ở đó sau khi khởi động lại, vì vậy có vẻ như mới bắt đầu chắc chắn không bắt đầu dịch vụ của tôi. Tôi cho rằng nó có thể chết ở một thời điểm sớm hơn trong quá trình, nhưng điều đó dường như không chắc chắn vì sự đơn giản của tất cả.

CẬP NHẬT 2 : Tôi vừa nâng cấp lên 11.10, bao gồm nâng cấp mới bắt đầu, nhưng sự cố này vẫn xảy ra.

CẬP NHẬT 3 : Theo yêu cầu, tôi đã khởi động cùng --debug. Đầu ra của con mèo /var/log/syslog | grep initquá dài để đặt vào câu hỏi, nhưng bạn xem nó ở đây .

CẬP NHẬT 4 : Thêm nhật ký, lần này, conf upstart được bao gồm ở đầu. Chạy 1chạy 2 .


Bạn có chắc kịch bản không được thực thi? Thông báo dừng / chờ pms có nghĩa là công việc mới bắt đầu đã được chạy và tất cả các lệnh kết thúc bình thường.
sắp xếp

Thêm đầu ra cat /var/log/syslog | grep initsau khi cho phép đăng nhập khởi động để khởi động bằng cách sử dụng các hướng dẫn tại Upstart Debugging
Ciaran Liedeman

@Anarci: vui lòng xem cập nhật 3 trong câu hỏi của tôi.
Kent Boogaart

Hầu hết người dùng sẽ không cung cấp địa chỉ email như vậy, thay vào đó cung cấp một liên kết đến một trang web pastebin như Ubuntu pastebin
Ciaran Liedeman

@Anarci: xong - vui lòng xem câu hỏi của tôi.
Kent Boogaart

Câu trả lời:


19

Tôi sẽ khuyên bạn nên tăng mức độ chi tiết của công việc, ví dụ bằng cách sử dụng các mục nhập trước khi bắt đầu / sau khi bắt đầu.

pre-start script
  logger "pre-start for myprog"
end script

post-start script
  logger "post-start for myprog"
end script

# and for PMS itself:
script
  logger "just before executing PMS"
  exec /home/administrator/pms-current/PMS.sh
end script

Thông tin thêm tại http://upstart.ubfox.com/cookbook/

Ngoài ra, hãy xem http://upstart.ubfox.com/wiki/Debugging


Điều này thực sự đang làm tôi suy nghĩ. Tôi đã thử hàng tá thứ khác nhau từ phía sau bài viết của bạn. Tất cả đã thất bại với các thông điệp tối nghĩa khác nhau trong nhật ký. Nỗ lực mới nhất của tôi đã dẫn đến init: pms quy trình chính (1329) chấm dứt với trạng thái 143 , có nghĩa là không hợp với tôi. Tôi có thể thấy rằng PMS.sh thậm chí không được bắt đầu bởi vì điều đầu tiên nó làm là ghi vào nhật ký của chính nó và mục nhập nhật ký đó không xuất hiện. Tôi có thể thấy đầu ra trước khi bắt đầu của mình, nó cho tôi biết rằng tệp đích tồn tại và có thể thực thi được. Tôi sẽ chọn lại nó vào ngày mai, nhưng nếu bạn có bất kỳ ý tưởng nào tôi muốn nghe chúng. Cảm ơn.
Kent Boogaart

xin chào @KentBoogaart, tôi dường như có vấn đề tương tự của bạn. Bạn đã tìm thấy một giải pháp?
Daniele B

@KentBoogaart Tôi có cùng một vấn đề với bạn? Bất kỳ may mắn với bạn?
Mevin Babu

14

Điều có lẽ xảy ra ở đây là pms đang bắt đầu trước khi bộ điều hợp mạng của bạn xuất hiện và có lẽ trước cả bộ điều hợp loopback (lo). Giả sử chúng ta đang nói về PS3 Media Server, đó là một dịch vụ được kết nối mạng và có lẽ không giống như bắt đầu với không có giao diện có sẵn.

Hãy thử thay đổi bắt đầu của bạn trên các tiêu chí để:

start on filesystem and net-device-up IFACE!=lo

Có nghĩa là, bắt đầu sau khi bất kỳ giao diện mạng "thực" nào được đưa lên. Tuy nhiên, điều đó có thể không lý tưởng, nếu eth0 là giao diện tiếp theo, PMS bắt đầu, nhưng bạn thực sự muốn PMS sử dụng wlan0, điều đó sẽ không xảy ra. Dịch vụ sẽ bắt đầu nhưng có thể không chọn được giao diện mà bạn muốn nghe. Giả sử bạn biết giao diện bạn sẽ phát trực tuyến và nó sẽ không thay đổi, tôi sẽ mã hóa nó vào công việc, ví dụ:

start on filesystem and net-device-up IFACE=wlan0

Trên Oneiric (11.10), bạn có thể sử dụng sự kiện static-network-upđể chờ tất cả các thiết bị được định cấu hình tĩnh. Điều này là tốt bởi vì nó cho phép bạn viết các công việc phụ thuộc vào mạng mà không cần mã hóa giao diện. [Lưu ý: bởi "tất cả các thiết bị được định cấu hình tĩnh", tôi đang đề cập đến việc sử dụng /etc/network/interfacesthay vì NetworkManager. Nó không có nghĩa là tĩnh theo nghĩa của IP tĩnh so với DHCP.]


Điều này nghe có vẻ như mánh khóe, nhưng nó không hoạt động. Tôi chỉ có loeth0nhưng tôi đã sử dụng đề xuất thứ hai của bạn : start on filesystem and net-device-up IFACE=eth0. Vẫn không đi sau khi khởi động lại. Tôi vừa nhận thấy một cái gì đó trong nhật ký PMS có thể là một khách hàng tiềm năng. Tôi sẽ điều tra và lấy lại ...
Kent Boogaart

Thật thú vị. Một điều tôi đã không đề cập là tôi đã thử tập lệnh gốc của bạn và nó đã hoạt động khi khởi động cho máy của tôi. Tôi cho rằng chỉ vì sự may mắn của trận hòa (tức là trong điều kiện cuộc đua của tôi , chiếc xe tốt đã thắng, và trong chiếc xe xấu của bạn đã thắng). Tôi thực sự không thể thấy những gì phụ thuộc khác chúng ta đang thiếu ở đây. Kỳ dị.
Mark Russell

2
Vì bạn có thể khởi động nó sau khi khởi động lên, chúng tôi phải thiếu một phụ thuộc dịch vụ khác. Một hack bẩn có thể hoạt động (nhưng sẽ không chiếu sáng chúng ta) là chỉ cần thả một sleep 10- hoặc cao hơn - trong một "tập lệnh trước khi bắt đầu" trước khi thực thi tập lệnh shell.
Mark Russell

Xin lỗi Mark - nhưng chúng tôi đang ở trên cùng một trang. Tôi đã thử 10 điều đã ngủ trong kịch bản trước khi bắt đầu. Không đi. Sau đó, tôi đã cố gắng xóa debug.log hoàn toàn và khởi động lại. Sau khi khởi động, tôi có trạng thái dịch vụ tương tự và không có tệp debug.log, vì vậy tôi không tin PMS thực sự chạy được. Có một cách dễ dàng để chẩn đoán điều này? Nếu tôi thay đổi PMS.sh để nhổ một số đầu ra, nó sẽ đi đâu? Tôi cho rằng tôi luôn có thể hướng nó đến tập tin của riêng mình - có thể cho nó một cú đánh tiếp theo.
Kent Boogaart

Tôi chỉ cập nhật câu hỏi của tôi với nhiều thông tin hơn.
Kent Boogaart

3

Từ việc kiểm tra nhật ký hệ thống của bạn, quá trình pms bắt đầu không có lỗi nhưng sau một thời gian ngắn, mục tiêu của nó được thay đổi từ đầu sang dừng nghĩa là nó bị giết.

Điều này hơi lạ vì bạn đã thêm mệnh đề repsawn nên nó sẽ cố gắng bắt đầu lại sau khi nó bị dừng nhưng nó không bao giờ thực hiện. Vì vậy, tôi đoán bạn đã loại bỏ điều khoản hồi sinh.

Giữa dịch vụ pms bắt đầu và dừng chỉ có 2 dịch vụ được bắt đầu ufw và giao diện mạng (eth0) và 1 được bắt đầu udev-fallback-Graphics.

Có vẻ như bạn xử lý pms đang được bắt đầu song song. Thật không may, tài liệu mới bắt đầu hơi mơ hồ về sự khác biệt chính xác giữa start on ...vanilla và start on starting ...start on started ....

Hãy thử thay đổi khổ thơ khởi động của bạn thành

start on started networking

hoặc chỉ là quá

start on net-device-up IFACE=eth0

Đầu ra nhật ký hơi lạ vì sự kiện thiết bị mạng xuất hiện muộn hơn nhiều nhưng pms bắt đầu trước nó.

Điều này sẽ đảm bảo rằng quy trình của bạn chỉ bắt đầu khi tất cả các thiết lập mạng đã kết thúc, tức là công việc không chỉ bắt đầu mà còn kết thúc.

Cũng không hoàn toàn tin tưởng đầu ra nhật ký, đầu vào quá trình khởi động ghi nhật ký vào bất kỳ tệp nào không phải lúc nào cũng hoạt động. Xem câu trả lời trong Gỡ lỗi khởi động


3

Quản lý để khắc phục vấn đề tương tự bằng cách sử dụng start trên runlevel thay thế:

start on runlevel [2345]

3

Tôi đã có cùng một vấn đề và cuối cùng tôi đã giải quyết nó đơn giản với:

start on runlevel [2345]

mà không cần bất kỳ net-device-uphoặc started networkingthứ

Đây là kịch bản hoàn chỉnh mới bắt đầu và nó hoạt động hoàn hảo:

# MyApp

description     "MyApp"
author          "me"

start on runlevel [2345]
stop on runlevel [016]

respawn

exec /usr/bin/myapp 2>> /var/logs/myapp.log

1

Tôi đã đi qua chkconfigtrong khóa đào tạo RHCSA / CE của mình:

sudo apt-get install chkconfig
sudo chkconfig pms on

Bạn có thể kiểm tra trang người dùng Oneiric để biết thêm chi tiết về các khả năng của nó.


1

Tôi đã tìm thấy một giải pháp cho việc này nhưng tôi không hiểu nó. Nếu tôi di chuyển PMS ra khỏi /home/administratorvà vào /bin/pmsvới quyền root là chủ sở hữu, tất cả đều hoạt động tốt.

Nếu tôi để nó bên dưới /home/administrator/nhưng đảm bảo root là chủ sở hữu của tất cả các thanh /home/administrator/thư mục, nó vẫn không hoạt động.

Nếu tôi đặt quản trị viên làm chủ sở hữu của mọi thứ và thay đổi phần thích hợp trong tập lệnh của mình thành:

sudo su administrator -c '/home/administrator/pms-current/PMS.sh'

Nó vẫn không hoạt động.

Tôi cho rằng bây giờ tôi sẽ tạo một /home/root/thư mục và chuyển mọi thứ đến đó, mặc dù tôi thực sự muốn hiểu đầy đủ về điều này.


Vì vậy, chkconfigcũng không làm việc? Bạn đã thử đưa thư mục PMS.shvào root chưa? Nếu chỉ có giải pháp của bạn hoạt động, hãy truy cập trang Launchpad của Upstart và liên hệ trực tiếp với các nhà phát triển.
Oxwivi

Và nếu chỉ cần di chuyển .shthì chỉ cần để mọi thứ ở đó và chỉnh sửa tập lệnh để trỏ đến thư mục đó (hoặc thậm chí có thể thay đổi thư mục?).
Oxwivi

Có, tôi đã thử làm cho toàn bộ thư mục PMS được sở hữu bởi root. Có lẽ nó không hoạt động vì / home / quản trị viên / không thuộc sở hữu của root.
Kent Boogaart

Dù sao thì điều này cũng không có ý nghĩa gì, tôi thường xuyên chạy các tập lệnh trong thư mục / home của mình thông qua việc khởi động mà không gặp vấn đề gì, lạ.
sắp xếp

Thậm chí xa lạ: Tôi chỉ thử mọi thứ dưới / home / root / mà rõ ràng là sở hữu bởi root. Không hoạt động. Tôi đã chuyển mọi thứ trở lại dưới / bin / pms và nó hoạt động trở lại. Vì vậy, có vẻ như cố gắng khởi động PMS từ dưới / nhà không hoạt động trên hệ thống của tôi.
Kent Boogaart

1

Tôi gặp vấn đề "không bắt đầu" tương tự khi tôi nhận ra rằng tập lệnh của tôi phụ thuộc vào một tập tin trong nhà của tôi và nhà không thể truy cập được vì được mã hóa bằng cơ chế ub Ubuntu tiêu chuẩn (.Private).

start on local-filesystems sự kiện là (có thể) được phát ra trước khi quá trình giải mã kết thúc.


1

Là thư mục nhà của bạn trên NFS? Đôi khi root không thể truy cập NFS.

Đối với hồ sơ, trong bài kiểm tra nhỏ của tôi vừa mới vào ngày 12.04:

  • start on started networkingstart on network-interface-up INTERFACE=eth0 không làm việc, nhưng

  • start on started network-interface INTERFACE=eth0 làm.

Cảm ơn http://os4.org/wiki/upstart.html vì đã chỉ ra rằng initctl list luôn hiển thị mạng công việc là dừng.


Các liên kết tham chiếu bị hỏng.
slm


0

Tương tự như @xuhcc, tôi đến đây để tìm hiểu lý do tại sao tập lệnh Vagrant Upstart của tôi không chạy. Sau đây được cho là để làm việc:

bắt đầu gắn kết

Nhưng không có trong một số bản dựng do lỗi sau.

https://github.com/mitchellh/vagrant/issues/6074

Cách giải quyết được liệt kê trong báo cáo có tác dụng rất lớn đối với tôi:

$ cat /etc/init/workaround-vagrant-bug-6074.conf 
# workaround for https://github.com/mitchellh/vagrant/issues/6074
start on filesystem
task

env MOUNTPOINT=/vagrant

script
  until mountpoint -q $MOUNTPOINT; do sleep 1; done
  /sbin/initctl emit --no-wait vagrant-mounted MOUNTPOINT=$MOUNTPOINT
end script

Làm việc tuyệt vời cho tôi


0

nó hoạt động với tôi (tôi cần bắt đầu dịch vụ sau khi tăng tốc):

start on started networking and net-device-up IFACE=wlan1 
stop on shutdown

respawn
respawn limit 10 10
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.