Điểm:0

đơn vị thả vào systemd, ExecStartPre với tư cách là người dùng root, ExecStart với tư cách là người dùng tùy chỉnh

lá cờ ru

Tôi có một dịch vụ web đang chạy bằng systemd, dịch vụ này do người dùng của chính nó điều hành và tôi muốn thực thi một số lệnh ExecStartPre nhưng chạy với tư cách người dùng root. Vì vậy, chi tiết hơn:

tức là /lib/systemd/system/webservice.service

[Đơn vị]
Muốn=mạng-online.mục tiêu
Sau=mạng-online.đích

[Dịch vụ]
Môi trườngFile=/etc/default/web
Nhóm=người dùng web
Loại = đơn giản
Khởi động lại = khi thất bại
WorkingDirectory=/usr/share/web
RuntimeDirectory=web
RuntimeDirectoryMode=0750
ExecStart=/usr/sbin/web --config=/etc/web/config.ini                               

[Cài đặt]
WantedBy=multi-user.target

và tôi muốn có một dịch vụ thả xuống nơi nó tìm nạp tệp config.ini từ một nguồn web

tức là /etc/systemd/system/web.service.d/local.conf

[Dịch vụ]
PermissionsStartOnly=true
Khởi động lạiSec=5
Tệp môi trường=/etc/môi trường
ExecStartPre=+/usr/bin/curl http://some.url --output /etc/web/config.ini 
ExecStartPre=+chown web:web /etc/web/config.ini  

Cấu hình trên không hoạt động do dịch vụ của tôi bị đóng băng trong quá trình khởi động mà không có bất kỳ thông báo nào trong bất kỳ nhật ký nào. Có cách nào tôi có thể làm cho một cái gì đó như thế để làm việc?

Andrew Lowther avatar
lá cờ jp
Là cấu hình bạn đăng làm những gì bạn muốn? Tôi không thể biết liệu bạn có cần trợ giúp để làm việc này hay không nếu bạn muốn biết liệu có cách nào sạch hơn hay không.
lá cờ ru
Bạn nói đúng, tôi định dạng lại câu hỏi của mình.
Điểm:0
lá cờ jp

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.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.