Đừng thường đăng bài ở đây nhưng tôi đang xé toạc cái này ra. Tôi có một tập lệnh Python sẽ khởi động khi nó khởi chạy và chịu trách nhiệm bắt đầu một loạt các quy trình khác. Kịch bản này đã từng được khởi chạy khi khởi động thông qua sysvinit, nhưng gần đây tôi đã nâng cấp lên Debian Jessie vì vậy đã điều chỉnh nó để khởi chạy qua systemd.
Thật không may, tôi đang gặp phải một vấn đề mà tôi không thể giải quyết được. Khi bạn khởi chạy tập lệnh trực tiếp trong trình bao người dùng, nó sẽ khởi chạy chính xác các quy trình con của nó và khi tập lệnh thoát ra, các quy trình con sẽ mồ côi và tiếp tục chạy.
Khi được khởi chạy Via systemd, nếu tiến trình cha mẹ thoát ra, tất cả trẻ em cũng thoát ra (Chà, Màn hình mà chúng khởi chạy trong trạng thái chết và xuất hiện dưới dạng Chết ???)
Lý tưởng nhất là tôi cần có khả năng khởi động lại tập lệnh gốc mà không giết tất cả các tiến trình con, có thiếu điều gì không?
Cảm ơn!
[Unit]
Description=Server commander
After=network.target
[Service]
User=serveruser
Type=forking
PIDFile=/var/Server/Server.pid
ExecStart=/var/Server/Server.py
ExecStop=/bin/kill -s TERM $MAINPID
[Install]
WantedBy=multi-user.target
Chỉnh sửa: Tôi có thể có liên quan để chỉ ra rằng tập lệnh Python về cơ bản là một 'bộ điều khiển' cho các quy trình con của nó. Nó khởi động và dừng máy chủ trong màn hình gnu theo yêu cầu từ máy chủ trung tâm. Nó thường luôn luôn chạy, nó không sinh ra các dịch vụ và thoát. Tuy nhiên, có một số trường hợp tôi muốn có thể tải lại tập lệnh mà không giết các tiến trình con, ngay cả khi điều đó có nghĩa là các tiến trình đó bị mồ côi thành pid 1. Trên thực tế, sẽ không có vấn đề gì nếu tập lệnh Python bắt đầu xử lý như một quá trình cha mẹ, nếu điều đó thậm chí có thể.
Một lời giải thích tốt hơn về cách thức hoạt động của nó:
- Systemd sinh ra /Server.py
- Server.py giả mạo và ghi tệp pid cho Systemd
- Sau đó, Server.py sinh ra các quy trình máy chủ trong màn hình gnu dựa trên hướng dẫn của nó
- Server.py tiếp tục chạy để thực hiện bất kỳ khởi động lại nào được yêu cầu từ máy chủ
Khi khởi chạy mà không có Systemd, Server.py có thể được khởi động lại và màn hình gnu mà nó khởi chạy không bị ảnh hưởng. Khi khởi chạy với Systemd, khi Server.py tắt, thay vì các quá trình màn hình đó bị mồ côi đến pid 1, chúng sẽ bị giết.
simple
hoặc forking
, thực tế), biện pháp cuối cùng sẽ là Type=oneshot
, RemainAfterExit=yes
và KillMode=control-group
.
Server.py
mã và mô tả về cách thức dịch vụ được đưa ra (nếu họ rẽ nhánh). Tuy nhiên, nói chung, đây là một vấn đề không phù hợp giao thức sẵn sàng .