Saya berencana meng-host beberapa contoh aplikasi web yang sama untuk pelanggan yang menggunakan systemd
. Saya ingin dapat stop
dan start
setiap instance pelanggan menggunakan systemd
, serta memperlakukan seluruh koleksi instance pelanggan sebagai layanan tunggal yang dapat dihentikan dan dimulai bersama.
systemd
tampaknya memberikan blok bangunan yang perlu saya gunakan PartOf
, dan templat file unit, tetapi pergi saya menghentikan layanan induk, layanan pelanggan anak tidak berhenti. Bagaimana saya bisa membuat ini bekerja dengan systemd? Inilah yang saya miliki sejauh ini.
Induk berkas Unit, app.service
:
[Unit]
Description=App Web Service
[Service]
# Don't run as a deamon (because we've got nothing to do directly)
Type=oneshot
# Just print something, because ExecStart is required
ExecStart=/bin/echo "App Service exists only to collectively start and stop App instances"
# Keep running after Exit start finished, because we want the instances that depend on this to keep running
RemainAfterExit=yes
StandardOutput=journal
File template unit bernama [email protected]
, digunakan untuk membuat instance pelanggan:
[Unit]
Description=%I Instance of App Web Service
[Service]
PartOf=app.service
ExecStart=/home/mark/bin/app-poc.sh %i
StandardOutput=journal
app-poc.sh
Skrip saya (Bukti konsep yang hanya mencetak untuk mencatat file dalam satu lingkaran):
#!/bin/bash
# Just a temporary code to fake a full daemon.
while :
do
echo "The App PoC loop for $@"
sleep 2;
done
Untuk bukti dari konsep, saya punya file Unit systemd di ~/.config/systemd/user
.
Saya kemudian memulai induk dan turunannya berdasarkan templat (setelah systemctl --user daemon-reload
):
systemctl --user start app
systemctl --user start [email protected]
Dari menggunakan journalctl -f
saya dapat melihat bahwa keduanya mulai dan bahwa instance pelanggan terus berjalan. Sekarang saya-saya berharap mematikan orang tua akan menghentikan anak (karena saya menggunakan PartOf
), tetapi tidak. Juga, memulai orang tua juga tidak memulai anak seperti yang diharapkan.
systemctl --user stop app
Terima kasih!
(Saya menggunakan Ubuntu 16.04 dengan systemd 229).
Requires=
?Jawaban:
Anda harus memindahkan garis
dari
[Service]
dan ke[Unit]
bagian, dan menambah[Unit]
dariapp.service
daftar pelanggan untuk memulai, misalnyaatau seperti yang dikatakan sourcejedi dalam komentar,
Requires=
hal yang sama. Anda dapat menjagaPartOf
agar layanan berhenti Anda mulai dengan tangan yang tidak ada dalam daftar di atas, sepertisystemctl --user start [email protected]
.sumber
PartOf
. Terima kasih. Saya akan menangani "Mau" melalui symlink, yang menjadi tindakan tunggal yang perlu saya ambil untuk mengaktifkan pelanggan baru dengan systemd. Untuk kasus pengujian saya: `ln -s /home/mark/.config/systemd/user/[email protected] / home / mark / .config / systemd / user / app.service.wants / unity @ foo.service`Saya belajar bahwa ini untuk apa Systemd "Target Unit". Dengan menggunakan Unit Target, saya mendapatkan manfaat yang saya inginkan tanpa perlu membuat bagian palsu yang
[Service]
saya miliki di atas. Contoh "Unit Target" yang berfungsi terlihat seperti ini:Maka setiap instance pelanggan harus termasuk
PartOf
dalam[Unit]
bagian (seperti yang ditunjukkan oleh @meuh), dan juga harus memiliki[Install]
bagian sehinggaenable
dandisable
akan bekerja pada layanan spesifik:Untuk memunculkan instance pelanggan dan memulainya saat target dimulai, perintah aktifkan satu kali ini digunakan:
Sekarang pada titik ini saya dapat menggunakan
stop
danstart
padaapp@customer
untuk untuk contoh spesifik, atau bisa saya gunakanstart app
danstop app
untuk menghentikan semua aplikasi bersama-sama.sumber
systemctl status $(systemctl list-dependencies --plain otp.target)
systemd
dapat meningkatkan kegunaan di sini. Saya telah membuka permintaan fitur untuk menyarankan peningkatan status untuk target.