Chạy trong khi đúng trong tập lệnh systemd


8

Tôi đã nhận được một kịch bản bash về cơ bản này:

#!/bin/bash

[...]

 while true; do
         str="broadcast "`randArrayElement "messages[@]"`
         server_send_message $str
         sleep $interval
 done

Bây giờ tôi muốn chạy nó như một dịch vụ systemd, tập lệnh dịch vụ của tôi trông như thế này:

[Unit]
Description=Announcer
After=network.target

[Service]
ExecStart=/usr/local/bin/somescript &; disown
ExecStop=/usr/bin/kill -9 `cat /tmp/somescript.pid`
Type=forking
PIDFile=/tmp/somescript.pid

[Install]
WantedBy=default.target

Thật không may khi tôi chạy dịch vụ này thông qua service somescript startnó đang hoạt động nhưng do vòng lặp thực sự mà thiết bị đầu cuối của tôi bị kẹt khi bắt đầu tập lệnh:

 somescript.service - somescript service
   Loaded: loaded (/etc/systemd/system/somescript.service; disabled; vendor preset: enabled)
   Active: activating (start) since Wed 2016-08-17 12:22:34 CEST; 43s ago
  Control: 17395 (somescript)
   CGroup: /system.slice/somescript.service
           ├─17395 /bin/bash /usr/local/bin/somescript &; disown
           └─17409 sleep 600

Làm cách nào tôi có thể chạy tập lệnh này như một dịch vụ mà không bị kẹt trong "bắt đầu" / vòng lặp trong khi đúng?

Câu trả lời:


8

Bạn cần phải để systemd làm việc cho bạn. Hãy để nó xử lý việc giả mạo khi bắt đầu và giết chết quá trình. Ví dụ: thay thế phần dịch vụ của bạn bằng

[Service]
Type=simple
ExecStart=/usr/local/bin/somescript
PIDFile=/tmp/somescript.pid

sau đó bạn có thể sử dụng systemctl start, statusstop. Bạn phải nhớ rằng các dòng trong systemd KHÔNG được diễn giải bởi shell, vì vậy, ví dụ của bạn &;chỉ được truyền dưới dạng một tham số khác gồm 2 ký tự cho tập lệnh của bạn.


Được rồi cảm ơn, tôi đã làm những thay đổi. Thật không may, kịch bản vẫn bị treo khi cố gắng khởi động nó như trước đây.
Flatron

1
Bạn có nhớ làm sudo systemctl daemon-reloadkhông?
meuh

Bạn có biết những khoảnh khắc này bạn nghĩ rằng bạn đã làm một cái gì đó mặc dù bạn không? Cảm ơn nó hoạt động! :)
Flatron

1

Tùy thuộc vào yêu cầu của bạn, bạn có thể xem xét để thay thế vòng lặp của mình bằng cấu hình hẹn giờ systemd. Nó sẽ không bắt đầu dịch vụ hai lần ngay cả khi server_send_message mất nhiều thời gian hơn "OnUnitActiveSec":

somescript.timer

[Unit]
Description=Announce every minute

[Timer]
OnUnitActiveSec=1m
AccuracySec=10s
Unit=somescript.service

[Install]
WantedBy=default.target

somescript.service Dịch vụ phần:

[Service]
Type=oneshot
ExecStart=/usr/bin/sh -c 'str="broadcast "`randArrayElement "messages[@]"`; server_send_message $str'
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.