Tôi nghĩ rằng thiết lập systemd của bạn là chính xác. Nếu thiết bị đầu cuối bị treo khi bạn bắt đầu dịch vụ thì tôi nghi ngờ ExecStartPre
lệnh không thoát.
Tôi đã chạy các lệnh sau với quyền root trên máy chủ Ubuntu 20.04 để kiểm tra thiết lập dịch vụ tương tự.
Tạo người dùng cho dịch vụ.
useradd --system myservice
Tạo tập lệnh cho dịch vụ ghi lại người dùng tập lệnh đang chạy và lặp lại.
mèo <<'EOF' > /usr/local/bin/myservice.sh
#!/usr/bin/env bash
# đối số đầu tiên là số vòng lặp, mặc định là vô hạn
i=${1:--1}
trong khi :; làm
ngày >> ${RUNTIME_DIRECTORY:-/tmp}/run.log
whoami >> ${RUNTIME_DIRECTORY:-/tmp}/run.log
(( --i == 0 )) && ngắt
ngủ ${SLEEP:-60}
xong
EOF
Thêm tệp dịch vụ và tệp ghi đè.
con mèo <<EOF > /etc/systemd/system/myservice.service
[Đơn vị]
Mô tả=Dịch vụ của tôi
[Dịch vụ]
Tệp môi trường=-/etc/default/myservice
Loại = đơn giản
Người dùng = dịch vụ của tôi
Nhóm=dịch vụ của tôi
Khởi động lại = khi thất bại
RuntimeDirectory=myservice
RuntimeDirectoryMode=0750
ExecStart=/bin/bash /usr/local/bin/myservice.sh
EOF
mkdir -p /etc/systemd/system/myservice.service.d/
con mèo <<EOF> /etc/systemd/system/myservice.service.d/override.conf
[Dịch vụ]
PermissionsStartOnly=true
ExecStartPre=/bin/bash /usr/local/bin/myservice.sh 1
ExecStartPre=chown myservice.myservice /run/myservice/run.log
EOF
systemctl daemon-tải lại
Bắt đầu dịch vụ
systemctl bắt đầu myservice.service
Kết quả đúng như mong đợi. Các chạy.log
tệp hiển thị tập lệnh được chạy một lần dưới dạng nguồn gốc
và sau đó tiếp tục chạy như dịch vụ của tôi
người dùng cho đến khi dịch vụ bị dừng.
root@ubuntu:~# ls -al /run/myservice/
tổng cộng 4
drwxr-x--- 2 myservice myservice 60 ngày 27 tháng 2 18:23 .
drwxr-xr-x 30 gốc gốc 1080 ngày 27 tháng 2 18:23 ..
-rw-r--r-- 1 myservice myservice 73 ngày 27 tháng 2 18:23 run.log
root@ubuntu:~# mèo /run/myservice/run.log
CN ngày 27 tháng 2 18:23:14 UTC 2022
nguồn gốc
CN ngày 27 tháng 2 18:23:14 UTC 2022
dịch vụ của tôi
CN ngày 27 tháng 2 18:24:14 UTC 2022
dịch vụ của tôi
Tôi đã tìm thấy rằng nếu ExecStartPre
lệnh đi vào vòng lặp thì thiết bị đầu cuối dường như bị treo khi dịch vụ được khởi động. Điều đó có thể giải thích tại sao bạn cho rằng dịch vụ của mình đang bị đóng băng. Các ExecStartPre
lệnh có thể vẫn đang chạy hoặc có thể không hoàn thành.
Ghi chú khác
- Tôi thấy rằng sử dụng một trong hai
PermissionsStartOnly=true
hoặc ExecStartPre=+...
có tác dụng tương tự khi chạy ExecStartPre
tập lệnh làm gốc.