Bagaimana saya bisa meluncurkan layanan systemd pada startup sebelum layanan systemd lain dimulai?

9

Saya menjalankan Ubuntu 16.04 pada Laptop HP lama

Saya telah menginstal beberapa perangkat lunak untuk menciptakan server plex kecil buatan sendiri. Saya telah menginstal sonarr, radarr, banjir, jackett, dll dan mereka semua secara otomatis diluncurkan saat startup!

Beberapa hari yang lalu saya memutuskan untuk menginstal rclone juga dan saya telah membuat (berkat proyek GitHub) beberapa folder yang harus dipasang pada setiap startup dengan meluncurkan skrip (saya meluncurkannya melalui penulisan terminal sudo ~/bin/check.mount). Sonarr dan Radarr diatur untuk mengunduh barang melalui banjir ke folder temp dan kemudian mengekspornya ke salah satu dari dua folder yang dipasang ini.

Masalahnya adalah, pada saat saya secara manual meluncurkan skrip Sonarr / Radarr sudah berdiri dan berjalan dan tidak dapat menemukan folder root mereka, jadi mereka memberi saya kesalahan.

Yang ingin saya lakukan adalah membuat layanan mountgdrive.ser (layanan, atau apa pun yang diperlukan) untuk secara otomatis meluncurkan skrip check.mount dan, jika itu tidak cukup, masukkan penundaan di sonarr.service dan radarr.service! Apakah itu mungkin?

Saya menulis ini dengan 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

dan ditambahkan ke sonarr.service dan radarr.service mountgdrive.servicedi After=bit, seperti ini

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

[Service]
User=samsepioldoresh4ze
etcetc
....

Tapi itu tidak berhasil! Sonarr dan Radarr mulai secara normal, tetapi drive tidak terpasang! Apa yang saya lakukan salah?


Juga, rtcwake tidak berfungsi di laptop saya - saya pikir ini masalah kernel ?! Apakah ada cara untuk memperbaikinya?

samsepioldoloresh4ze
sumber
1
Jika saya mengerti benar, Anda ingin sonarr.servicedan radarr.serviceakan dijalankan setelah mountgdrive.servicehabis dan berjalan?
Dan
@Bis tepatnya! masalahnya adalah, cara saya menulisnya ternyata mountgdrive.serviceberjalan tetapi tidak melakukan apa-apa (tidak me-mount drive), dan kemudian sonarr.servicedan radarr.serviceberjalan secara normal karena ubuntu dieksekusimountgdrive.service
samsepioldoloresh4ze
1
Saya juga merekomendasikan Anda melihat ke .mountunit . Jika semua yang Anda mountgdrive.servicelakukan adalah memasang direktori atau sejenisnya, Anda mungkin dapat mengubahnya ke .mountlayanan. Karena membuatnya lebih dapat diandalkan khususnya karena Anda memiliki ketergantungan padanya.
Dan

Jawaban:

26

Alasan Anda mengalami masalah ini adalah karena Anda menggunakan After=saat Anda juga membutuhkan Requires=atau Wants=.

Ada 3 properti utama untuk mengelola dependensi. Saya akan mencoba menjelaskan perbedaannya secara singkat tetapi Anda dapat menemukan rincian lebih lanjut di Bagian Pilihan [Unit] | freedesktop.org

  1. After=

    Opsi ini hanya mengatur urutan unit, itu tidak menjamin bahwa layanan telah selesai memulai.

  2. Wants=

    Opsi ini memungkinkan unit Anda untuk memulai hanya setelah unit lain selesai memulai. (Tidak masalah apakah itu mulai berhasil atau tidak)

  3. Requires=

    Sama seperti Wants=, bagaimanapun, ini akan membuat unit Anda mulai hanya setelah dependensi telah berhasil dimulai.

Anda juga dapat menggunakan kebalikan dari masing-masing opsi tersebut.

  1. After= dibalikan oleh Before=
  2. Wants= dibalikan oleh WantedBy=
  3. Requires= dibalikan oleh RequiredBy=

Untuk memperbaiki masalah Anda, Anda perlu mengubah layanan pemasangan ke:

[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

Atau Anda dapat menambahkan Wants=mountgdrive.serviceke sonarr.servicedan radarr.serviceunit.

Anda dapat melakukannya tanpa memodifikasi file default dengan menjalankan yang berikut (Anda perlu melakukan hal yang sama untuk radarr.service):

systemctl edit sonarr.service

Dan masukkan yang berikut ini:

[Unit]
Wants=mountgdrive.service

Catatan: Anda dapat mengganti Wants=dengan Requiresatau WantedBy=dengan RequiredBy=jika Anda tidak ingin kedua layanan memulai sama sekali jika mountgdrive.servicegagal (Meskipun Wants=biasanya cukup dan bahkan direkomendasikan dalam dokumen).

EDIT: Opsi WantedBydan RequiredByhanya dapat digunakan di bawah [Install]bagian. (Terima kasih @Yankee )

Dan
sumber
terima kasih untuk Wants=dan WantedBy=, saya pasti akan menggunakannya !! Saya mendapatkan kesalahan ini ketika saya me-restart laptop i.imgur.com/a3LE3G9.png
samsepioldoloresh4ze
1
Tampaknya ada kesalahan dalam skrip. Anda dapat melihatnya dari baris yang berakhir dengan Can't open /.config/SmokeScreen/smokescreen.conf. Mungkin Anda memiliki "~ / .config / ..." di skrip yoru. Anda harus mengganti tilde ( ~) dengan path lengkap yaitu /home/you_user_name/.config/....(Atau gunakan path relatif ke skrip Anda)
Dan
github.com/FourFingerLifeHug/SmokeScreen/blob/master/... - ini adalah script check.mount, jadi saya harus mengubah semua $ (HOME) dan $ (bindir) dengan path lengkap? Terima kasih!
samsepioldoloresh4ze
1
@ samsepioldoloresh4ze Yap, $HOMEbelum tersedia saat boot, karena belum ada pengguna yang masuk.
Dan
Haruskah WantedBy=di [Unit]bagian? Saya pikir itu hanya bisa masuk [Install].
Yankee