GNU/Linux >> Belajar Linux >  >> Linux

Menghentikan Unit Systemd Bersama Dengan Yang Lain. Memulai Pekerjaan?

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.

Terkait:Pemilih Tanggal Bootstrap hanya berfungsi pada baris pertama GridView?

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 .


Linux
  1. Cara Mengelola Layanan Systemd dengan Systemctl di Linux

  2. Systemd Run Unit Pada Keberhasilan Lain?

  3. Bagaimana mengatasi layanan MySQL yang mulai dan berhenti secara tidak terduga

  1. Bagaimana menghentikan layanan systemd

  2. Bagaimana cara menjalankan skrip sebelum yang lainnya dimatikan dengan systemd?

  3. Bagaimana cara menjalankan skrip dengan systemd tepat sebelum dimatikan?

  1. 10 perintah systemd yang berguna:Referensi

  2. Linux – Bagaimana Mendapatkan Lebih Sedikit Ttys Dengan Systemd?

  3. Mengapa Systemd Menghentikan Layanan Segera Setelah Dimulai?