Saya tidak dapat menemukan cara yang benar untuk menjalankan beberapa skrip lokal (atau perintah yang sangat lokal) di systemd, saya sudah tahu saya tidak boleh membuat layanan (dalam systemd unit) untuk jenis skrip ini (atau saya harus?) ....
Solusi yang saya temukan adalah membuat rc.local dan memberikan izin eksekusi padanya.
printf '#!/bin/bash \n\nexit 0' >/etc/rc.local
chmod +x /etc/rc.local
Misalnya, jika saya mendapatkan server lama dengan rc.local sederhana yang dikonfigurasikan oleh Anda, saya akan tahu apa yang Anda lakukan dan seberapa parahnya untuk memutakhirkan atau menginstal sesuatu yang baru di distro, karena rc.local dihormati oleh eksternal paket, tetapi di sisi lain jika saya menginstal server dan membuat unit systemd atau dua atau tiga (atau bahkan layanan sysvinit), hanya untuk melakukan tugas sederhana, ini kadang-kadang dapat membuat hidup Anda lebih sulit, dan lebih dari ini unit saya nama suatu hari nanti dapat bertentangan dengan nama-nama layanan baru yang dibuat oleh pengembangan distribusi, dan mungkin diinstal pada peningkatan, menyebabkan masalah untuk skrip saya!
Saya melihat pertanyaan lain bertanya tentang di mana rc.local dan jawabannya adalah untuk menciptakan dan memberikan hak akses eksekusi, saya pikir pertanyaan saya adalah benar-benar tidak sebuah duplikat , karena saya tidak ingin tahu di mana itu - percayalah, aku hanya ingin untuk menerima bahwa itu sudah usang , tetapi saya tidak dapat menemukan cara yang benar untuk melakukan hal-hal semacam ini, haruskah saya benar-benar membuat unit hanya untuk beberapa hal sederhana seperti itu?
Jawaban:
Seperti yang ditunjukkan di tempat lain, itu menjadi tidak bersih untuk digunakan di
rc-local.service
bawahsystemd
.poweroff
/reboot
perintah yang banyak digunakan orang).rc-local.service
satu cara, tetapi Debian menyediakan file drop-in yang mengubah setidaknya satu pengaturan penting.rc-local.service
sering bisa bekerja dengan baik. Jika Anda khawatir tentang hal di atas, yang perlu Anda lakukan adalah membuat salinannya sendiri! Inilah keajaibannya: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 mendeklarasikannya. Misal menambahkan[Unit]
bagian, dengan garisWants=network-online.target
danAfter=network-online.target
.Anda tidak perlu khawatir tentang ketergantungan pada layanan "boot awal" - khususnya, layanan yang sudah dipesan sebelumnya
basic.target
. Layanan sepertimy-startup.service
secara otomatis dipesan setelahnyabasic.target
, kecuali jika ditetapkanDefaultDependencies=no
.Jika Anda tidak yakin apakah salah satu dependensi Anda adalah layanan "boot awal", satu pendekatan adalah mendaftar layanan yang dipesan sebelumnya
basic.target
, dengan menjalankansystemctl list-dependencies --after basic.target
. (Catat itu--after
, bukan--before
).Ada beberapa pertimbangan yang menurut saya juga berlaku untuk pre-systemd
rc.local
:rc.local
.[*] Saya menggunakan
Type=oneshot
+RemainAfterExit=yes
karena lebih masuk akal untuk sebagian besar skrip sekali pakai . Ini memformalkan bahwa Anda akan menjalankan serangkaian perintah, yangmy-startup
akan ditampilkan sebagai "aktif" setelah mereka selesai, dan bahwa Anda tidak akan memulai daemon.sumber
.service
unit sistem asli , atau jika Anda benar-benar ingin menulis skrip init LSB Anda dapat melakukannya. Saya tidak ingin merekomendasikan menempatkan beberapa daemonrc-local.service
atau yang setara, saya pikir itu mungkin berhasil, tetapi tampaknya jauh lebih baik jika Anda dapat me-restart masing-masing daemon dengansystemctl restart my-daemon
seperti yang lainnya. Ini dimaksudkan agar Anda memasukkan layanan lokal Anda/etc/systemd/system
.local-
...Type=oneshot
... itu memformalkan bahwa ... Anda tidak akan memulai daemon. Jika Anda ingin informasi tentang memulai daemon, silakan ajukan pertanyaan baru.Lupakan
rc.local
.Seperti yang saya katakan tentang CentOS 7 dan tentang Debian 8 dan tentang Ubuntu 15 :
Anda menggunakan sistem operasi systemd + Linux.
/etc/rc.local
adalah mekanisme kompatibilitas mundur ganda dalam systemd, karena ini merupakan mekanisme kompatibilitas mundur untuk mekanisme yang dengan sendirinya merupakan mekanisme kompatibilitas dalam klon van Smoorenburg System 5rc
.Menggunakan
/etc/rc.local
bisa salah besar. Orang-orang terkejut dengan fakta bahwa systemd tidak berjalanrc.local
dengan cara yang sama, di tempat yang sama di bootstrap, seperti yang biasa mereka lakukan. (Atau keliru berharap: Sebenarnya, itu tidak berjalan terakhir dalam sistem lama, seperti yang ditunjukkan oleh manual OpenBSD.) Yang lain terkejut dengan fakta bahwa apa yang mereka atur dalamrc.local
mengharapkan cara lama dalam melakukan sesuatu, adalah kemudian benar-benar dibatalkan oleh orang-orang seperti baruudev
aturan, NetworkManager,systemd-logind
,systemd-resolved
, atau berbagai "Kit" s.Seperti dicontohkan oleh " Mengapa` init 0` menghasilkan "Kelebihan Argumen" pada Arch instal? ", Beberapa sistem operasi sudah menyediakan systemd tanpa fitur kompatibilitas mundur seperti
systemd-rc-local-generator
generator . Sementara Debian masih mempertahankan fitur kompatibilitas ke belakang , Arch Linux membangun systemd dengan mereka dimatikan . Jadi pada Arch dan sistem operasi seperti itu diharapkan/etc/rc.local
sepenuhnya diabaikan .Lupakan
rc.local
. Itu bukan cara untuk pergi. Anda memiliki systemd + sistem operasi Linux. Jadi buatlah unit layanan systemd yang tepat, dan jangan mulai dari titik yang dua tingkat kompatibilitas mundur. (Di Ubuntu dan Fedora, tiga kali dihapus, klon van Smoorenburg System 5rc
yang diikutirc.local
kemudian telah dua kali digantikan, lebih dari satu dekade yang lalu, pertama oleh pemula dan kemudian oleh systemd.)Juga ingat aturan pertama untuk bermigrasi ke systemd .
Ini bahkan bukan ide baru yang khusus untuk systemd. Pada sistem van Smoorenburg
rc
dan Upstart, yang harus dilakukan adalah membuatrc
skrip van Smoorenburg yang tepat atau file pekerjaan pemula daripada menggunakanrc.local
. Bahkan catatan manual FreeBSD bahwa saat ini orang membuatrc
skrip Mewburn yang tepat alih-alih menggunakan/etc/rc.local
. Mewburnrc
diperkenalkan oleh NetBSD 1.5 pada tahun 2000./etc/rc.local
tanggal dari waktu Edisi Ketujuh Unix dan sebelumnya. Itu digantikan oleh/etc/inittab
dan berbasis runlevelrc
di AT&T Unix System 3 (dengan sedikit berbeda/etc/inittab
di AT&T Unix System 5) pada tahun 1983 . Bahkan itu sekarang sejarah.Buat definisi layanan asli yang tepat untuk sistem manajemen layanan Anda, apakah itu bundel layanan untuk nosh toolset
service-manager
dansystem-control
,/etc/rc.d/
skrip untuk Mewburnrc
, file unit layanan untuk systemd, file pekerjaan untuk Pemula, direktori layanan untuk runit / s6 / daemontools -encore, atau bahkan/etc/init.d/
naskah untuk van Smoorenburgrc
.Dalam systemd, file unit layanan yang ditambahkan administrator seperti itu
/etc/systemd/system/
biasanya masuk (atau/usr/local/lib/systemd/system/
jarang). Dengan manajer layanan nosh,/var/local/sv/
adalah tempat konvensional untuk bundel layanan lokal. Mewburnrc
pada penggunaan FreeBSD/usr/local/etc/rc.d/
. File unit layanan yang dikemas dan bundel layanan, jika Anda membuatnya, pergi ke tempat yang berbeda.Bacaan lebih lanjut
rc.local
. Manual Manajer Sistem FreeBSD . 2016-04-23./etc/rc.local
atauchmod -x
itu . Bug Redhat # 734268.rc.local
mulai awal . bug systemd # 7703rc.local
. bencane.com./etc/inittab
adalah sesuatu dari masa lalu. . Jawaban yang Sering Diberikan.systemd.unit
" Jalur pencarian sistem tidak ada dari halaman manual ". Errata untuk systemd doco . Jawaban yang Sering Diberikan.sumber
Ringkasan https://www.linuxbabe.com/linux-server/how-to-enable-etcrc-local-with-systemd
Buat /etc/systemd/system/rc-local.service:
Kemudian:
Periksa dengan:
sumber
StandardOutput=journal+console
(konsol setara dengan tty dalam contoh Anda), yang sepertinya akan jauh lebih berguna untuk pemecahan masalah. Dukungan untukSysVStartPriority=
telah dihapus di beberapa titik. Mungkin Anda bisa berkomentar betapa pentingnyaSysVStartPriority=
, atau menghapusnya. Terlepas dari itu, itu adalah jawaban yang layak.