Saya tidak dapat menemukan cara yang benar untuk menjalankan beberapa lokal skrip (atau perintah yang sangat lokal) di systemd, saya sudah tahu bahwa saya tidak boleh membuat layanan (dalam unit systemd) untuk skrip semacam ini (atau harus?)….
Solusi yang saya temukan adalah membuat rc.local dan memberikannya izin eksekusi.
printf '#!/bin/bash nnexit 0' >/etc/rc.local
chmod +x /etc/rc.local
Misalnya, jika saya mendapatkan server lama dengan rc.local sederhana yang dikonfigurasi oleh Anda, saya akan tahu apa yang Anda lakukan dan betapa sakitnya untuk meningkatkan atau menginstal sesuatu yang baru di distro, karena rc.local dihormati oleh eksternal paket, tetapi di sisi lain jika saya menginstal server dan membuat satu atau dua atau tiga unit systemd (atau bahkan layanan sysvinit), hanya untuk melakukan tugas sederhana, ini terkadang dapat membuat hidup Anda lebih sulit, dan lebih dari ini unit saya nama suatu hari nanti dapat bertentangan dengan nama layanan baru yang dibuat oleh pengembangan distribusi, dan mungkin diinstal pada peningkatan, menyebabkan masalah untuk skrip saya !
Saya melihat pertanyaan lain menanyakan tentang di mana rc.local dan jawabannya adalah untuk membuatnya dan memberikan izin eksekusi, saya pikir pertanyaan saya benar-benar tidak sebuah duplikat , karena saya tidak ingin tahu di mana itu – percayalah, saya hanya ingin menerima bahwa itu tidak digunakan lagi , tetapi saya tidak dapat menemukan cara yang tepat untuk melakukan hal semacam ini, haruskah saya benar-benar membuat unit hanya untuk hal-hal sederhana seperti itu?
Jawaban yang Diterima:
Seperti yang ditunjukkan di tempat lain, penggunaan rc-local.service
menjadi agak tidak bersih di bawah systemd
.
- Secara teoritis mungkin distribusi Anda tidak akan mengaktifkannya. (Saya pikir ini tidak umum, misalnya karena menonaktifkan opsi build yang sama juga menghapus
poweroff
/reboot
perintah yang digunakan banyak orang). - Semantiknya tidak sepenuhnya jelas. Systemd mendefinisikan
rc-local.service
satu arah, tetapi Debian menyediakan file drop-in yang mengubah setidaknya satu pengaturan penting.
rc-local.service
sering dapat bekerja dengan baik. Jika Anda khawatir tentang hal di atas, yang perlu Anda lakukan hanyalah membuat salinannya sendiri! Inilah keajaibannya:
# /etc/systemd/system/my-startup.service
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/local/libexec/my-startup-script
[Install]
WantedBy=multi-user.target
Saya rasa Anda tidak perlu memahami setiap detail[*], tetapi ada dua hal yang perlu Anda ketahui di sini.
-
Anda harus mengaktifkan ini dengan
systemctl enable my-startup.service
. -
Jika skrip Anda memiliki ketergantungan pada layanan lain, termasuk
network-online.target
, Anda harus menyatakannya. Misalnya. tambahkan[Unit]
bagian, dengan barisWants=network-online.target
danAfter=network-online.target
.Anda tidak perlu khawatir tentang ketergantungan pada layanan "boot awal" – khususnya, layanan yang sudah dipesan sebelum
basic.target
. Layanan sepertimy-startup.service
secara otomatis dipesan setelahbasic.target
, kecuali mereka menyetelDefaultDependencies=no
.Jika Anda tidak yakin apakah salah satu dependensi Anda adalah layanan "boot awal", salah satu pendekatannya adalah dengan membuat daftar layanan yang dipesan sebelum
basic.target
, dengan menjalankansystemctl list-dependencies --after basic.target
. (Perhatikan bahwa--after
, bukan--before
).
Ada beberapa pertimbangan yang menurut saya juga diterapkan pada rc.local
pra-systemd :
- Anda perlu memastikan perintah Anda tidak bertentangan dengan program lain yang mencoba mengontrol hal yang sama.
- Sebaiknya jangan memulai program yang berjalan lama alias daemon dari
rc.local
.
[*] Saya menggunakan Type=oneshot
+ RemainAfterExit=yes
karena lebih masuk akal untuk sebagian besar skrip one-shot. Ini memformalkan bahwa Anda akan menjalankan serangkaian perintah, yang my-startup
akan ditampilkan sebagai "aktif" setelah selesai, dan Anda tidak akan memulai daemon.