Bagaimana Anda membuat layanan systemd sebagai layanan terakhir saat boot?

26

Bertahun-tahun yang lalu, kita dapat menulis skrip startup kita /etc/rc.local. Setelah semua layanan sistem dimuat, skrip Anda akan berjalan.

Sekarang, kami menggunakan systemd, kami tidak punya rc.locallagi. Systemd memulai layanan paralel. Anda dapat menulis layanan Anda sendiri untuk menjalankan rc.local` tetapi Anda tidak dapat memastikan layanan akan berjalan setelah semua layanan sistem dimuat.

Apakah ada cara untuk melakukannya? Atau kita harus menggunakan Beforedan Afterdalam file layanan systemd?

尔尔
sumber
5
Systemd, bukan pemula !!
比尔 盖子
Tentukan nama dan versi OS?
STTR
OS: Arch Linux, Versi: T / A
比尔 盖子
1
@ 尔尔 盖子 Mengapa "terakhir", apakah Anda tidak tahu dependensi skrip, atau Anda ingin yang terakhir hanya untuk aman?
Paul

Jawaban:

27

Dalam systemd disarankan untuk menggunakan Before=dan After=memesan layanan Anda dengan baik di sekitar yang lain.

Tetapi karena Anda meminta cara tanpa menggunakan Beforedan After, Anda dapat menggunakan:

Type=idle

yang man systemd.servicemenjelaskan:

Perilaku idlesangat mirip dengan simple; namun, eksekusi sebenarnya dari program layanan ditunda hingga semua pekerjaan aktif diberangkatkan. Ini dapat digunakan untuk menghindari interleaving dari output layanan shell dengan output status pada konsol. Perhatikan bahwa jenis ini hanya berguna untuk meningkatkan output konsol, ini tidak berguna sebagai alat pemesanan unit umum, dan efek dari jenis layanan ini dikenakan batas waktu 5 detik, setelah itu program layanan tetap digunakan.

SimonPe
sumber
1
Hai, apakah Anda ingin menguraikan sintaks jika saya akan menggunakan sebelum atau sesudah?
r4ccoon
Topik yang agak berbeda, tetapi jika seseorang ingin menjalankan proses pengguna yang terpisah dari proses sistem, ada askubuntu.com/a/859583/457417
Ben Creasy
bekerja sempurna untuk set /proc/sys/kernel/modules_disabledke 1pada akhir proses boot
Stuart Cardall
0

Itu benar-benar tergantung pada definisi Anda tentang "boot". Saya berasumsi Anda ingin segera berjalan setelah getty dimulai. Untuk melakukan ini, Anda perlu menambahkan layanan Anda ke /etc/systemd/system/getty.target.wants/direktori. Anda juga harus memastikan file Anda menggunakan kode yang mirip dengan layanan lain di direktori ini. Untuk menjalankan layanan khusus saat bootup dan shutdown (cukup bunyi bel motherboard saya) saya menggunakan script berikut di/etc/systemd/system/getty.target.wants/service_name.service

[Unit]
After=systemd-user-sessions.service plymouth-quit-wait.service
After=rc-local.service
Before=getty.target
IgnoreOnIsolate=yes

[Service]
ExecStart=/usr/bin/myinitscript.sh start
ExecStop=/usr/bin/myinitscript.sh stop
Type=oneshot
RemainAfterExit=true

[Install]
WantedBy=basic.target

/usr/bin/myinitscript.sh dieksekusi dan memiliki shebang di awal.

Perhatikan bahwa tidak semuanya akan dimulai pada titik ini di boot, tetapi ini adalah titik di mana prompt masuk muncul kepada pengguna

Meskipun ini memang menggunakan Before=dan After=, bagi saya itu jauh lebih dimengerti dan benar-benar berfungsi; Saya tidak menemukan jawaban di atas cukup informatif. Ini juga memungkinkan Anda untuk menggunakan keduanya ExecStart=dan ExecStop=, bukannya terbatas pada Type=simplelayanan seperti.

Hack5
sumber
-2

Saya tidak terbiasa dengan spesifik atau ArchLinux, tapi di sini adalah cara mengelola systemd secara umum.

Yah, pada dasarnya systemd adalah kumpulan skrip di /etc/init.d/ yang ditunjukkan oleh symlinks dari /etc/rcX.d, di mana X adalah jumlah run level. Symlinks sendiri memiliki format berikut:

[K | S] + nn + [string]

dimana:

  • nn adalah angka yang menentukan urutan skrip dijalankan
  • string adalah nama skrip seperti yang muncul di /etc/init.d/
  • dan akhirnya K atau S menentukan perintah bahwa skrip dipanggil dengan: berhenti atau mulai masing-masing.

Jadi, jika Anda ingin skrip Anda berjalan terakhir dalam urutan boot, Anda perlu melakukan hal berikut:

  1. letakkan skrip Anda di /etc/init.d/ dan buat itu bisa dieksekusi
  2. tentukan runlevel target skrip harus mulai dari (tip 2 untuk konsol dan 5 untuk antarmuka pengguna grafis). Dapat ditentukan dengan sesuatu sepertirunlevel
  3. lihat skrip apa yang sudah ada di runlevel ini ls /etc/rc<target runlevel>.d/dan pilih angka dua digit yang lebih besar daripada yang sudah ada di sana.
  4. menggunakan utilitas khusus untuk distribusi Anda seperti update-rc.duntuk berbasis Debian atau chkconfiguntuk Fedora atau secara manual, buat symlink /etc/rc.d/S ke skrip init Anda.
Pavel A
sumber
5
Apa yang telah Anda jelaskan sebenarnya adalah sysVinit. Meskipun benar bahwa systemd kompatibel dengan cara kerja sysVinit, ada satu perbedaan utama - semuanya dilakukan secara paralel. Ada juga dua jenis layanan, layanan sysVinit, dan layanan systemd. Jawaban Anda dapat membantu menjalankan sesuatu setelah layanan sysVinit, tetapi belum tentu yang systemd.
Sam
1
Systemd tidak bertujuan untuk kompatibel dengan sysvinit sama sekali, sejak hari pertama.
lzap