Tại sao đơn vị systemd của tôi không chạy được khi khởi động lại máy chủ?


7

Tôi gặp sự cố khi tệp tệp đơn vị dịch vụ systemd chạy chính xác khi máy chủ khởi động lại. Máy chủ này là bản cài đặt CentOS 7.0.1406 mới. Tôi đang cố gắng thiết lập nó với nhiều phiên bản Apache httpd. Trên bản cài đặt CentOS cũ hơn, tôi đã có các phiên bản httpd hoạt động tốt và vì vậy bây giờ tôi đang cố gắng chuyển các cấu hình đó sang CentOS mới sử dụng systemd.

Tôi có thể kích hoạt dịch vụ, khởi động nó, khởi động lại và dừng nó mà không gặp vấn đề gì. Khi tôi thực hiện khởi động lại, nó báo "Không có tệp hoặc thư mục như vậy". Nếu tôi kích hoạt dịch vụ, mọi thứ sẽ hoạt động trở lại cho đến lần khởi động lại tiếp theo.



Tệp dịch vụ:

[Unit]
Description=Apache web server instance apache01
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/data/apacheinstances/apache01/logs/httpd.pid
ExecStart=/data/apacheinstances/apache01/bin/apachectl start
ExecStop=/data/apacheinstances/apache01/bin/apachectl stop
ExecReload=/data/apacheinstances/apache01/bin/apachectl reload
PrivateTmp=true
LimitNOFILE=infinity

[Install]
WantedBy=multi-user.target



Làm thế nào tôi kích hoạt nó:

$ sudo systemctl enable /data/apacheinstances/apache01/bin/apache01.service
ln -s '/data/apacheinstances/apache01/bin/apache01.service' '/etc/systemd/system/multi-user.target.wants/apache01.service'
ln -s '/data/apacheinstances/apache01/bin/apache01.service' '/etc/systemd/system/apache01.service'


$ sudo systemctl status apache01
apache01.service - Apache web server instance apache01
   Loaded: loaded (/data/apacheinstances/apache01/bin/apache01.service; enabled)
   Active: inactive (dead)



Làm thế nào tôi bắt đầu nó:

$ sudo systemctl start apache01


$ sudo systemctl status apache01
apache01.service - Apache web server instance apache01
   Loaded: loaded (/data/apacheinstances/apache01/bin/apache01.service; enabled)
   Active: active (running) since Wed 2014-10-08 14:37:56 PDT; 13s ago
  Process: 1740 ExecStart=/data/apacheinstances/apache01/bin/apachectl start (code=exited, status=0/SUCCESS)
 Main PID: 1746 (httpd)
   CGroup: /system.slice/apache01.service
           +-1746 /usr/local/httpd-2.4.10-apache01/bin/httpd -f /data/apacheinstances/apache01/conf/httpd.conf -k start
           +-1747 /usr/local/sbin/cronolog /data/apacheinstances/apache01/logs/error_log-%Y%m
           +-1748 /usr/local/sbin/cronolog /data/apacheinstances/apache01/logs/access_log-%Y%m
           +-1749 /usr/local/httpd-2.4.10-apache01/bin/httpd -f /data/apacheinstances/apache01/conf/httpd.conf -k start
           +-1750 /usr/local/httpd-2.4.10-apache01/bin/httpd -f /data/apacheinstances/apache01/conf/httpd.conf -k start
           +-1751 /usr/local/httpd-2.4.10-apache01/bin/httpd -f /data/apacheinstances/apache01/conf/httpd.conf -k start

Oct 08 14:37:56 server105 apachectl[1740]: Starting apache01: [  OK  ]
Oct 08 14:37:56 server105 systemd[1]: PID file /data/apacheinstances/apache01/logs/httpd.pid not readable (yet?) after start.
Oct 08 14:37:56 server105 systemd[1]: Started Apache web server instance apache01.



Làm thế nào tôi khởi động lại nó:

$ sudo systemctl restart apache01


$ sudo systemctl status apache01
apache01.service - Apache web server instance apache01
   Loaded: loaded (/data/apacheinstances/apache01/bin/apache01.service; enabled)
   Active: active (running) since Wed 2014-10-08 14:38:40 PDT; 12s ago
  Process: 1836 ExecStop=/data/apacheinstances/apache01/bin/apachectl stop (code=exited, status=0/SUCCESS)
  Process: 1844 ExecStart=/data/apacheinstances/apache01/bin/apachectl start (code=exited, status=0/SUCCESS)
 Main PID: 1850 (httpd)
   CGroup: /system.slice/apache01.service
           +-1850 /usr/local/httpd-2.4.10-apache01/bin/httpd -f /data/apacheinstances/apache01/conf/httpd.conf -k start
           +-1851 /usr/local/sbin/cronolog /data/apacheinstances/apache01/logs/error_log-%Y%m
           +-1852 /usr/local/sbin/cronolog /data/apacheinstances/apache01/logs/access_log-%Y%m
           +-1853 /usr/local/httpd-2.4.10-apache01/bin/httpd -f /data/apacheinstances/apache01/conf/httpd.conf -k start
           +-1855 /usr/local/httpd-2.4.10-apache01/bin/httpd -f /data/apacheinstances/apache01/conf/httpd.conf -k start
           +-1856 /usr/local/httpd-2.4.10-apache01/bin/httpd -f /data/apacheinstances/apache01/conf/httpd.conf -k start

Oct 08 14:38:40 server105 apachectl[1844]: Starting apache01: [  OK  ]
Oct 08 14:38:40 server105 systemd[1]: PID file /data/apacheinstances/apache01/logs/httpd.pid not readable (yet?) after start.
Oct 08 14:38:40 server105 systemd[1]: Started Apache web server instance apache01.



Làm thế nào tôi dừng nó lại:

$ sudo systemctl stop apache01


$ sudo systemctl status apache01
apache01.service - Apache web server instance apache01
   Loaded: loaded (/data/apacheinstances/apache01/bin/apache01.service; enabled)
   Active: inactive (dead) since Wed 2014-10-08 14:39:44 PDT; 12s ago
  Process: 1940 ExecStop=/data/apacheinstances/apache01/bin/apachectl stop (code=exited, status=0/SUCCESS)
  Process: 1844 ExecStart=/data/apacheinstances/apache01/bin/apachectl start (code=exited, status=0/SUCCESS)
 Main PID: 1850 (code=exited, status=0/SUCCESS)

Oct 08 14:38:40 server105 apachectl[1844]: Starting apache01: [  OK  ]
Oct 08 14:38:40 server105 systemd[1]: PID file /data/apacheinstances/apache01/logs/httpd.pid not readable (yet?) after start.
Oct 08 14:38:40 server105 systemd[1]: Started Apache web server instance apache01.
Oct 08 14:39:44 server105 systemd[1]: Stopping Apache web server instance apache01...
Oct 08 14:39:44 server105 apachectl[1940]: Stopping apache01: [  OK  ]
Oct 08 14:39:44 server105 systemd[1]: Stopped Apache web server instance apache01.



Trạng thái sau khi khởi động lại:

$ sudo systemctl status apache01
apache01.service
   Loaded: not-found (Reason: No such file or directory)
   Active: inactive (dead)

Oct 08 14:44:58 server105 systemd[1]: Cannot add dependency job for unit apache01.service, ignoring: Unit apache01.service failed to load: No such file or directory.



Làm thế nào tôi có thể bắt đầu và bắt đầu nó:

$ sudo systemctl reenable /data/apacheinstances/apache01/bin/apache01.service
rm '/etc/systemd/system/apache01.service'
rm '/etc/systemd/system/multi-user.target.wants/apache01.service'
ln -s '/data/apacheinstances/apache01/bin/apache01.service' '/etc/systemd/system/multi-user.target.wants/apache01.service'
ln -s '/data/apacheinstances/apache01/bin/apache01.service' '/etc/systemd/system/apache01.service'


$ sudo systemctl start apache01


$ sudo systemctl status apache01
apache01.service - Apache web server instance apache01
   Loaded: loaded (/data/apacheinstances/apache01/bin/apache01.service; enabled)
   Active: active (running) since Wed 2014-10-08 14:52:20 PDT; 5s ago
  Process: 1737 ExecStart=/data/apacheinstances/apache01/bin/apachectl start (code=exited, status=0/SUCCESS)
 Main PID: 1743 (httpd)
   CGroup: /system.slice/apache01.service
           +-1743 /usr/local/httpd-2.4.10-apache01/bin/httpd -f /data/apacheinstances/apache01/conf/httpd.conf -k start
           +-1744 /usr/local/sbin/cronolog /data/apacheinstances/apache01/logs/error_log-%Y%m
           +-1745 /usr/local/sbin/cronolog /data/apacheinstances/apache01/logs/access_log-%Y%m
           +-1746 /usr/local/httpd-2.4.10-apache01/bin/httpd -f /data/apacheinstances/apache01/conf/httpd.conf -k start
           +-1747 /usr/local/httpd-2.4.10-apache01/bin/httpd -f /data/apacheinstances/apache01/conf/httpd.conf -k start
           +-1748 /usr/local/httpd-2.4.10-apache01/bin/httpd -f /data/apacheinstances/apache01/conf/httpd.conf -k start

Oct 08 14:52:20 server105 apachectl[1737]: Starting apache01: [  OK  ]
Oct 08 14:52:20 server105 systemd[1]: PID file /data/apacheinstances/apache01/logs/httpd.pid not readable (yet?) after start.
Oct 08 14:52:20 server105 systemd[1]: Started Apache web server instance apache01.

Tôi không chắc tại sao nó hoạt động mà không gặp sự cố trước khi khởi động lại nhưng thất bại sau đó. Nếu tôi không thực hiện được, tôi sẽ tiếp tục gặp lỗi tương tự về "Không có tệp hoặc thư mục như vậy".

Tôi đã cố gắng nghiên cứu chức năng ghi nhật ký trong systemd để xác định tệp hoặc thư mục nào nó không thể tìm thấy nhưng đã rút ra một khoảng trống.

Có ai khác có kinh nghiệm loại hành vi này trước đây?


1
Hãy thử chuyển dịch vụ sang /etc/systemd/system/và xem vấn đề còn tồn tại không.
kyrias

@kyrias mà làm việc. Một điều tôi quên đề cập đến là / dữ liệu được gắn trên một ổ đĩa khác. Tôi nghĩ rằng có "After = remote-fs.target" sẽ đảm bảo ổ đĩa / dữ liệu được gắn trước khi dịch vụ được khởi động (giả sử đó là lý do cho "Không có tệp hoặc thư mục như vậy"). Các tệp đơn vị có bắt buộc phải nằm trong thư mục / etc / systemd / system không? Nếu không, tôi vẫn thích các tệp hơn với các cấu hình cá thể httpd còn lại chỉ để sao lưu và tài liệu dễ dàng hơn một chút.
Richard Morris

systemdsẽ cần phải đọc các .servicetập tin để phân tích cú pháp After=remote-fs.target. systemdbắt đầu sớm trong quá trình khởi động và đọc tất cả các .servicetệp (hoặc liên kết tượng trưng đến các tệp này). Tại thời điểm này, .servicetệp của bạn nằm trên một hệ thống tệp từ xa chưa được kết nối, do đó systemdphàn nàn rằng nó không thể tìm thấy nó khi nó cố gắng theo liên kết tượng trưng /etc/systemd. Nó thậm chí còn Afterchưa được tuyên bố. Điểm mấu chốt là tất cả .servicecác tệp cần phải nằm trên một hệ thống tệp có thể truy cập rất sớm trong quá trình khởi động.
garethTheRed

Câu trả lời:


9

Tất cả các dịch vụ cần được tải và phân tích cú pháp trước khi khởi động chúng và dịch vụ của bạn không có sẵn sớm trong quá trình khởi động khi systemd phân tích tất cả các dịch vụ vì nó nằm trên một phân vùng khác.

Để giải quyết, hãy giữ các dịch vụ địa phương /etc/systemd/system/hoặc tạo một gói cho phân phối của bạn và đặt chúng vào/usr/lib/systemd/system/


trời ơi, đây cũng là vấn đề của tôi, cuối cùng cũng hiểu nó sau nhiều giờ
peedee
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.