Bisakah saya menggunakan tautan simbolik sebagai layanan systemd?

14

Sebagai contoh, saya memiliki layanan bernama di mysshd.servicebawah /usr/lib/systemd/system/direktori. Dapatkah saya membuat tautan simbolis seperti:

ln -s /usr/lib/systemd/system/mysshd.service /usr/lib/systemd/system/fool.service

sehingga operasi apa pun yang saya lakukan dengan fool.service akan tercermin ke mysshd.service( systemctl enable/disable start/stop fool.servce)?

Tujuan saya adalah menimpa layanan sshd asli dengan tautan simbolis dari layanan sshd saya sendiri.

nick
sumber
1
Mengapa tidak menambah dan mengaktifkan layanan Anda dan menonaktifkan layanan sshd asli?
Lambert
Saya ingin perangkat lunak saya kompatibel dengan versi sebelumnya yang menggunakan tautan simbolik /etc/init.d/ssh -> /etc/init.d/myssh.
nick
Saya masih belum benar-benar mengerti apa yang Anda maksud tetapi sesuai dengan baris Anda <quote> sehingga operasi apa pun yang saya lakukan dengan fool.service akan direfleksikan ke mysshd.service (systemctl aktifkan / nonaktifkan start / stop start / stop fool.servce)? </ Quote > Anda mungkin melihat dependensi systemd (lihat wiki.archlinux.org/index.php/systemd#Handling_dependencies ) untuk memulai / mengaktifkan layanan Anda setelah sshd.
Lambert
@nick, selamat datang di Stack Exchange! di Stack Exchange adalah kebiasaan untuk menunjukkan pujian untuk jawaban dengan meningkatkan. Anda dapat melakukan ini dengan mengeklik panah atas di sebelah kiri jawaban. jika jawaban saya menyelesaikan masalah Anda, Anda mungkin juga mempertimbangkan untuk mengklik kotak centang, untuk menandainya sebagai diterima. Terima kasih!
strugee

Jawaban:

9

Sejauh yang saya tahu, systemd tidak akan menangani hal ini dengan baik. Seperti yang saya pahami, Anda ingin mengesampingkan perilaku sshd.service, kan?

Beruntung bagi Anda, systemd dirancang untuk hal semacam ini. Cukup masukkan definisi layanan Anda /etc/systemd/system/ssh.service, jalankan systemctl daemon-reloaduntuk memuat kembali file unit, dan systemd akan secara otomatis menggunakan konfigurasi itu daripada sistem ssh.service.

Ingin punya systemctl enable mysshd.servicepekerjaan juga? Tidak masalah. Di [Install]bagian file unit Anda, tambahkan baris yang mengatakan Alias=mysshd.service. Kemudian jalankan systemctl reenable ssh.serviceuntuk memiliki systemd memperbaiki unit symlink, dan Anda emas.

Sekarang, Anda belum memberikan perincian tentang apa mysshd.serviceyang seharusnya dilakukan. Jika itu sama sekali berbeda dari normal ssh.service, bagus! Gunakan metode di atas. Namun, jika Anda hanya ingin mengubah satu hal kecil, maka Anda menggunakan pendekatan yang salah. systemd memungkinkan Anda membuat "potongan" file unit yang akan diterapkan di atas file unit normal. Ini memungkinkan Anda menambah atau mengabaikan arahan individu sambil memungkinkan sisa file unit menerima pembaruan dari manajer paket. Untuk melakukan ini, cukup buat /etc/systemd/system/ssh.d/my-custom-config.conf(Anda dapat mengubahnya my-custom-config.confmenjadi apa pun yang Anda inginkan, dan Anda juga dapat memiliki beberapa file override). Dalam file itu, tempatkan arahan apa pun yang ingin Anda ubah atau tambahkan ke yang biasa ssh.service. Anda bahkan dapat menambahkan Alias=arahan, sehingga systemctl start mysshd.serviceberhasil! Ingatlah untuk mengeksekusisystemctl daemon-reloadsetelah Anda selesai (dan, jika Anda gunakan Alias=, systemctl reenable ssh.service).

Selain itu, jangan pernah mengubah file unit systemd di /usr/lib/systemd. Pernah! Standar Hierarki Filesystem mengharuskan yang /usrdiperlakukan sebagai hanya-baca. Dalam praktiknya, ini berarti bahwa manajer paket menangani /usr(kecuali untuk /usr/local), dan Anda tidak menyentuh apa yang ditangani manajer paket - terutama karena apa pun yang Anda ubah mungkin pada akhirnya akan ditimpa. Sebaliknya, letakkan barang-barang Anda di suatu tempat seperti /etc.

strugee
sumber
1
Untuk sedikit memperjelasnya: jika Anda ingin menimpa foo.service, jalankan sudo systemctl edit foo.service, dan itu akan menghemat apa pun yang Anda ketikkan /etc/systemd/system/foo.service.d/override.conf.
Rockallite
Juga, Alias=arahan TIDAK berfungsi dalam menimpa file. Lihat github.com/systemd/systemd/issues/1090
Rockallite
@Rockallite tidak tahu tentang systemctl editsaat saya menulis jawaban ini. jangan ragu untuk mengedit jawaban saya untuk mencerminkan Alias=bug (masukkan "OK dengan penjawab" atau sesuatu dalam pesan edit). tangkapan yang bagus.
strugee
5

Gunakan linkdengan path lengkap:

systemctl link /home/nick/myservice.service

Perhatikan bahwa Anda tidak dapat menautkan file layanan yang dengan sendirinya sudah berupa tautan.

Gunar Gessner
sumber