Pada server CentOS7, saya memiliki tumpukan aplikasi yang disusun oleh server web Tomcat dan server MySQL DB, keduanya diinstal pada VM yang sama.
Saya ingin keduanya memulai dan berhenti bersama dalam urutan ini:
START: MySQL--> Tomcat STOP: Tomcat-->MySQL
Membaca dokumentasi unit systemd, saya berhasil memulainya dengan Requires=
direktif, tetapi ketika saya menghentikan Tomcat dengan systemctl stop Tomcat.service, MySQL terus berjalan. Pada log sistem, saya perhatikan bahwa ia bahkan tidak mencoba menghentikan MySQL, jadi pasti ada yang salah dengan unit systemd.
Ini unit saya:
# Systemd unit file for tomcat [Unit] Description=Apache Tomcat Web Application Container After=syslog.target network.target mysql.service Requires=mysql.service [Service] Type=forking Environment=JAVA_HOME=/opt/jdk Environment=CATALINA_PID=/opt/tomcat/temp/tomcat.pid Environment=CATALINA_HOME=/opt/tomcat Environment=CATALINA_BASE=/opt/tomcat ExecStart=/opt/tomcat/bin/startup.sh ExecStop=/bin/kill -15 $MAINPID User=tomcat Group=tomcat [Install] WantedBy=multi-user.target
Jawaban yang Diterima:
Apa yang Anda lihat di sini adalah perilaku systemd yang diharapkan. Requires=
ketergantungan akan memastikan mysql.service
dimulai setiap kali tomcat.service
dimulai, tetapi begitu dimulai, dua unit independen dan satu tidak akan berhenti ketika yang lain.
Jika Anda benar-benar menginginkan mysql.service
akan dihentikan ketika tomcat.service
adalah, Anda dapat menggunakan PartOf=
direktif yang menghubungkan unit saat berhenti dan memulai kembali.
Untuk contoh yang Anda jelaskan (memiliki mysql.service
berhenti kapan pun tomcat.service
dihentikan), yang Anda butuhkan adalah menambahkan PartOf=tomcat.service
dengan definisi mysql.service
. Biasanya, cara terbaik untuk melakukannya adalah dengan menggunakan file override, yang dapat Anda lakukan dengan systemctl edit mysql.service
yang akan membuka editor teks dengan file kosong, lalu Anda dapat menambahkan cuplikan ini ke dalamnya:
[Unit]
PartOf=tomcat.service
Ini akan disimpan dalam file /etc/systemd/system/mysql.service.d/override.conf
yang menjadi bagian dari mysql.service
, Anda dapat memeriksanya dengan systemctl cat mysql.service
.
Setelah perubahan itu dan systemctl daemon-reload
, ini akan bekerja seperti yang Anda harapkan…
Mengenai pemesanan, semuanya akan berfungsi seperti yang Anda harapkan dengan satu After=mysql.service
yang Anda miliki di tomcat.service
, karena dependensi dihormati dalam urutan terbalik saat menghentikan layanan. (Yang berarti, dalam hal ini, tomcat.service
akan dihentikan terlebih dahulu, diikuti oleh mysql.service
.)
Menghentikan unit dengan cara ini mungkin tidak selalu merupakan ide yang baik… Mungkin pendekatan yang sedikit lebih baik adalah membuat .target
yang terpisah unit untuk mengelompokkan semua layanan yang ingin Anda kontrol bersama. Mungkin sesuatu seperti webservices.target
.
Anda akan membuat unit itu dengan konten seperti:
[Unit]
Description=Web Services
Requires=tomcat.service mysql.service
After=tomcat.target mysql.service
[Install]
WantedBy=multi-user.target
Dan kemudian memiliki keduanya tomcat.service
dan mysql.service
setel PartOf=webservices.target
, menggunakan mekanisme penggantian yang dijelaskan di atas.
Aktifkan unit target dengan systemctl enable webservices.target
, lalu Anda dapat memulai dan menghentikan kedua layanan bersama-sama dengan systemctl start webservices.target
atau systemctl stop webservices.target
.