Làm cách nào tôi có thể khởi chạy dịch vụ systemd khi khởi động trước khi dịch vụ systemd khác bắt đầu?


9

Tôi đang chạy Ubuntu 16.04 trên máy tính xách tay HP cũ

Tôi đã cài đặt một số phần mềm trên đó để tạo một máy chủ plex nhỏ tự chế. Tôi đã cài đặt sonarr, radarr, deluge, jackett, v.v. và tất cả chúng đều tự động khởi chạy khi khởi động!

Cách đây vài ngày, tôi cũng quyết định cài đặt rclone và tôi đã tạo (nhờ vào dự án GitHub) một vài thư mục phải được gắn vào mỗi lần khởi động bằng cách khởi chạy một tập lệnh (tôi khởi chạy nó thông qua ghi đầu cuối sudo ~/bin/check.mount). Sonarr và Radarr được thiết lập để tải nội dung qua deluge vào thư mục tạm thời và sau đó xuất nó sang một trong hai thư mục được gắn này.

Vấn đề là, vào thời điểm tôi tự khởi chạy tập lệnh Sonarr / Radarr đã sẵn sàng và đang chạy và không thể tìm thấy các thư mục gốc của chúng, vì vậy chúng gây ra lỗi cho tôi.

Những gì tôi muốn làm là tạo một mountgdrive.service (dịch vụ hoặc bất cứ điều gì cần thiết) để tự động khởi chạy tập lệnh check.mount và, nếu điều đó là không đủ, hãy chèn một độ trễ trong sonarr.service và radarr.service! Điều đó có thể không?

Tôi đã viết cái này với sudo nano /etc/systemd/system/mountgdrive.service

[Unit]
Description=MountSmokeScreen
After=network.target

[Service]
Type=oneshot
ExecStart=/home/samsepioldoloresh4ze/bin/check.mount
TimeoutStopSec=20
KillMode=process
Restart=on-failure

[Install]
WantedBy=multi-user.target

và được thêm vào sonarr.service và radarr.service mountgdrive.servicetrong After=bit, như thế này

[Unit]
Description=Sonarr
After=syslog.target network.target mountgdrive.service

[Service]
User=samsepioldoresh4ze
etcetc
....

Nhưng nó không hoạt động! Sonarr và Radarr bắt đầu bình thường, nhưng các ổ đĩa không được gắn kết! Tôi đang làm gì sai?


Ngoài ra, rtcwake không hoạt động trên máy tính xách tay của tôi - Tôi nghĩ đó là vấn đề hạt nhân?! Có cách nào để khắc phục điều đó?


1
Nếu tôi hiểu chính xác, bạn muốn sonarr.serviceradarr.serviceđược chạy sau khi mountgdrive.servicelên và chạy?
Dan

@Dan chính xác! vấn đề là, con đường tôi đã viết nó dường như mountgdrive.servicechạy nhưng không làm gì (nó không lắp các ổ đĩa), và sau đó sonarr.serviceradarr.servicechạy bình thường vì ubuntu thực hiệnmountgdrive.service
samsepioldoloresh4ze

1
Tôi cũng sẽ khuyên bạn nên nhìn vào .mountcác đơn vị . Nếu tất cả những gì bạn mountgdrive.serviceđang làm là gắn một thư mục hoặc tương tự, bạn có thể thay đổi nó thành một .mountdịch vụ. Vì nó làm cho nó đáng tin cậy hơn đặc biệt vì bạn có sự phụ thuộc vào nó.
Dan

Câu trả lời:


26

Lý do bạn gặp vấn đề này là vì bạn đang sử dụng After=trong khi bạn cũng cần Requires=hoặc Wants=.

Có 3 thuộc tính chính để quản lý các phụ thuộc. Tôi sẽ cố gắng giải thích ngắn gọn về sự khác biệt nhưng bạn có thể tìm thêm chi tiết tại [Đơn vị] Mục Tùy chọn | freedesktop.org

  1. After=

    Tùy chọn này chỉ đặt thứ tự của các đơn vị, nó không đảm bảo rằng dịch vụ đã bắt đầu khởi động.

  2. Wants=

    Tùy chọn này cho phép đơn vị của bạn bắt đầu chỉ sau khi đơn vị khác đã kết thúc khởi động. (Không quan trọng nếu nó bắt đầu thành công hay không)

  3. Requires=

    Wants=Tuy nhiên, giống như điều này sẽ làm cho đơn vị của bạn bắt đầu chỉ sau khi các phụ thuộc đã bắt đầu thành công.

Bạn cũng có thể sử dụng nghịch đảo của từng tùy chọn đó.

  1. After= bị đảo ngược bởi Before=
  2. Wants= bị đảo ngược bởi WantedBy=
  3. Requires= bị đảo ngược bởi RequiredBy=

Để khắc phục sự cố của bạn, bạn cần thay đổi dịch vụ gắn kết của mình thành:

[Unit]
Description=MountSmokeScreen
After=network.target
Before=sonarr.service radarr.service

[Service]
Type=oneshot
ExecStart=/home/samsepioldoloresh4ze/bin/check.mount
TimeoutStopSec=20
KillMode=process
Restart=on-failure

[Install]
WantedBy=multi-user.target sonarr.service radarr.service

Hoặc bạn có thể thêm Wants=mountgdrive.servicevào sonarr.serviceradarr.servicecác đơn vị.

Bạn có thể làm điều đó mà không cần sửa đổi các tệp mặc định bằng cách chạy như sau (Bạn cần làm tương tự cho radarr.service):

systemctl edit sonarr.service

Và chèn như sau:

[Unit]
Wants=mountgdrive.service

Lưu ý: Bạn có thể thay thế Wants=bằng Requireshoặc WantedBy=bằng RequiredBy=nếu bạn không muốn hai dịch vụ bắt đầu nếu mountgdrive.servicekhông thành công (Mặc dù Wants=thường là đủ và thậm chí được đề xuất trong tài liệu).

EDIT: Các tùy chọn WantedByRequiredBychỉ có thể được sử dụng trong [Install]phần. (Cảm ơn @Yankee )


cảm ơn Wants=WantedBy=, tôi chắc chắn sẽ sử dụng chúng !! Tôi gặp lỗi này mặc dù khi tôi khởi động lại máy tính xách tay i.imgur.com/a3LE3G9.png
samsepioldoloresh4ze

1
Dường như có một lỗi trong kịch bản. Bạn có thể nhìn thấy nó từ dòng kết thúc bằng Can't open /.config/SmokeScreen/smokescreen.conf. Có thể bạn có "~ / .config / ..." trong tập lệnh yoru. Bạn nên thay thế dấu ngã ( ~) bằng đường dẫn đầy đủ tức là /home/you_user_name/.config/....(Hoặc sử dụng đường dẫn tương đối cho tập lệnh của bạn)
Dan

github.com/FourFingerLifeHug/SmokeScreen/blob/master/ nam - đây là tập lệnh check.mount, vì vậy tôi nên thay đổi tất cả $ (HOME) và $ (bindir) với các đường dẫn đầy đủ? Cảm ơn!
samsepioldoloresh4ze

1
@ samsepioldoloresh4ze Yep, $HOMEkhông khả dụng khi khởi động, vì chưa có người dùng đăng nhập.
Dan

Có nên WantedBy=trong [Unit]phần? Tôi nghĩ rằng nó chỉ có thể đi vào [Install].
Yankee
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.