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.targetKetika 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/nullIni 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 bahwaExecStart
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
Terkait:Compiz + MATE windows melompat ke ruang kerja sebelumnya?start-stop-daemon
adalah mengapa hal-hal yang salah. Karena proses menjalankanstart-stop-daemon
tidak menjadi layanan, tetapi sebenarnya segera keluar, systemd berpikir bahwa layanan Anda akan dihentikan. Disystemctl status
pertama Anda output, Anda dapat melihat bahwa systemd sedang mengirimSIGTERM
untuk membersihkan semua proses yang tersisa setelah menjalankanExecStop
tindakan, yang dilakukan ketika layanan dianggap telah dihentikan.Lakukan saja dengan sederhana:
Type=simpleWorkingDirectory=/home/ubuntu/console/binUser=ubuntuExecStart=/home/ubuntu/console/bin/consoleExecutableTidak ada
ExecStop
atauEnvironment
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