GNU/Linux >> Belajar Linux >  >> Linux

Mengapa Systemd Menghentikan Layanan Segera Setelah Dimulai?

Saya memiliki aplikasi berbasis C++ yang saya jalankan (dapat dieksekusi) sebagai daemon dengan systemd.

Berkas Satuan:

[Unit]Description=Console ServiceAfter=network.target[Service]Environment="USER=ubuntu" "Path=/home/ubuntu/console/bin" WorkingDirectory=/home/ubuntu/console/binExecStart=/bin/ sh -ec "exec /sbin/start-stop-daemon -S -c ${USER} -d ${Path} --pidfile=/var/run/console.pid --oknodo --exec consoleExecutable " #2> /dev/nullExecStop=/bin/sh -ec "exec /sbin/start-stop-daemon -K --quiet -c ${USER} -d ${Path} --pidfile=/var/run/console.pid --retry=TERM/30/KILL/5 --oknodo --exec consoleExecutable" #2>/dev/nullRestart=on-failureRemainAfterExit=noTimeoutStopSec=10SuccessExitStatus=0 1TimeoutStartSec=360[Install]WantedBy=multi-pengguna.target 

Ketika saya mengeluarkan perintah start, layanan sedang memulai, tetapi kemudian segera menerima sinyal shutdown dan kemudian keluar.
Ada petunjuk, apa yang terjadi?

sudo systemctl status console.service● console.service - Layanan Konsol Dimuat:dimuat (/etc/systemd/system/console.service; diaktifkan; preset vendor:diaktifkan) Aktif:menonaktifkan (stop-sigterm) sejak Senin 2017- 09-25 19:58:58 UTC; 1 detik yang lalu Proses:8706 ExecStop=/bin/sh -ec exec /sbin/start-stop-daemon -K --quiet -c ${USER} -d ${Path} --pidfile=/var/run/console. pid --retry=TERM/30/KILL/5 --oknodo --exec consoleExecutable #2>/dev/null (kode=keluar, status=0/SUCCESS) Proses:8701 ExecStart=/bin/sh -ec exec / sbin/start-stop-daemon -S -c ${USER} -d ${Path} --pidfile=/var/run/console.pid --oknodo --exec consoleExecutable #2>/dev/null (code=keluar, status=0/SUCCESS) PID Utama:8701 (kode=keluar, status=0/SUCCESS) Tugas:1 Memori:1,8M CPU:53ms CGroup:/system.slice/console.service 8705 consoleExecutable25 Sep 19:58:58 mgmt1 systemd[1]:Memulai Layanan Konsol.sudo systemctl status console.service● console.service - Layanan Konsol Dimuat:dimuat (/etc/systemd/system/console.service; diaktifkan; preset vendor:diaktifkan) Aktif:tidak aktif (mati) sejak Senin 25-09-2017 19:59:01 UTC; 947ms yang lalu Proses:8706 ExecStop=/bin/sh -ec exec /sbin/start-stop-daemon -K --quiet -c ${USER} -d ${Path} --pidfile=/var/run/console. pid --retry=TERM/30/KILL/5 --oknodo --exec consoleExecutable #2>/dev/null (kode=keluar, status=0/SUCCESS) Proses:8701 ExecStart=/bin/sh -ec exec / sbin/start-stop-daemon -S -c ${USER} -d ${Path} --pidfile=/var/run/console.pid --oknodo --exec consoleExecutable #2>/dev/null (code=keluar, status=0/SUCCESS) PID Utama:8701 (kode=keluar, status=0/SUCCESS)25 Sep 19:58:58 mgmt1 systemd[1]:Memulai Layanan Konsol.

Jawaban yang Diterima:

Environment="USER=ubuntu" "Path=/home/ubuntu/console/bin" WorkingDirectory=/home/ubuntu/console/binExecStart=/bin/sh -ec "exec /sbin/start-stop -daemon -S -c ${USER} -d ${Path} --pidfile=/var/run/console.pid --oknodo --exec consoleExecutable " #2>/dev/nullExecStop=/bin/sh -ec "exec /sbin/start-stop-daemon -K --quiet -c ${USER} -d ${Path} --pidfile=/var/run/console.pid --retry=TERM/30/KILL/5 --oknodo --exec consoleExecutable" #2>/dev/null

Ini hampir layak untuk House of Horror systemd. Seandainya tidak ada cerita horor di sana yang melakukan ini.

Jangan gunakan start-stop-daemon di unit layanan untuk melakukan semua hal yang sudah dilakukan unit layanan . Dengan file PID yang tidak perlu dan asumsi yang salah bahwa ExecStart menerima komentar sintaks shell, tidak kurang.

Dan jangan lakukan apa yang dikatakan jawaban lain dan coba beri isyarat dengan Type=forking . Itu memperburuk keadaan, bukan lebih baik.

Omong kosong dengan start-stop-daemon adalah mengapa hal-hal yang salah. Karena proses menjalankan start-stop-daemon tidak menjadi layanan, tetapi sebenarnya segera keluar, systemd berpikir bahwa layanan Anda akan dihentikan. Di systemctl status pertama Anda output, Anda dapat melihat bahwa systemd sedang mengirim SIGTERM untuk membersihkan semua proses yang tersisa setelah menjalankan ExecStop tindakan, yang dilakukan ketika layanan dianggap telah dihentikan.

Terkait:Compiz + MATE windows melompat ke ruang kerja sebelumnya?

Lakukan saja dengan sederhana:

Type=simpleWorkingDirectory=/home/ubuntu/console/binUser=ubuntuExecStart=/home/ubuntu/console/bin/consoleExecutable

Tidak ada ExecStop atau Environment sebenarnya diperlukan.

Bacaan lebih lanjut

  • Jonathan de Boyne Pollard (2015). Anda benar-benar tidak perlu melakukan daemonisasi. Sungguh. . Sistem House of Horror.
  • Jonathan de Boyne Pollard (2016). Jika Anda memiliki dua layanan, tentukan dua layanan. . Sistem House of Horror.
  • Jonathan de Boyne Pollard (2015). Masalah protokol kesiapan dengan Unix dmons . Jawaban yang Sering Diberikan.
  • Systemd menghentikan layanan segera setelah dimulai

Linux
  1. Cara membuat layanan Systemd di Linux

  2. Centos – Systemd Membunuh Layanan Segera Setelah Mulai?

  3. Jalankan Layanan Systemd Setelah Automount Tapi Setelah Diakses?

  1. Mengapa Kebanyakan Contoh Systemd Berisi Wantedby=multi-user.target?

  2. Systemd:Menggunakan After dan Requires

  3. systemctl menghentikan layanan Tomcat segera setelah dimulai

  1. Menambahkan layanan baru ke sistem Linuxd

  2. Sistem menolak SSH dan macet saat 'boot up' setelah instalasi systemd

  3. Nonaktifkan layanan systemd setelah waktu idle