Saya menggunakan CentOS 7. Bagaimana cara mengetahui mengapa layanan gagal untuk memulai? Saya telah membuat layanan ini
[rails@server ~]$ sudo cat /usr/lib/systemd/system/nodejs.service
[Unit]
Description=nodejs server
[Service]
User=rails
Group=rails
ExecStart=/home/rails/NodeJSserver/start.sh
ExecStop=/home/rails/NodeJSserver/stop.sh
[Install]
WantedBy=multi-user.target
File menunjuk ke ini
[rails@server ~]$ cat /home/rails/NodeJSserver/start.sh
#!/bin/bash
forever start /home/rails/NodeJSserver/server.js
Saya dapat menjalankan file ini dengan baik dengan sendirinya. Tetapi ketika saya mencoba dan menjalankannya sebagai bagian dari layanan, saya perhatikan bahwa server nodeJS saya belum dimulai. Bahkan ketika saya memeriksa "sudo systemctl --state = gagal," Saya tidak melihat kesalahan apa pun ...
[rails@server ~]$ sudo systemctl enable NodeJSserver
[rails@server ~]$ sudo systemctl start NodeJSserver
[rails@server ~]$
[rails@server ~]$
[rails@server ~]$ forever list
info: No forever processes running
[rails@server ~]$
[rails@server ~]$
[rails@server ~]$ sudo systemctl --state=failed
UNIT LOAD ACTIVE SUB DESCRIPTION
● nginx.service loaded failed failed The nginx HTTP and reverse proxy server
● systemd-sysctl.service loaded failed failed Apply Kernel Variables
● systemd-vconsole-setup.service loaded failed failed Setup Virtual Console
LOAD = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB = The low-level unit activation state, values depend on unit type.
3 loaded units listed. Pass --all to see loaded but inactive units, too.
To show all installed unit files use 'systemctl list-unit-files'.
Bagaimana saya mencari tahu mengapa layanan saya gagal untuk memulai?
journalctl -u nodejs
seharusnya memberi Anda pesan kesalahan yang lebih bermakna.Jawaban:
Layanan Anda tidak
Type=
ditentukan di[Service]
bagian ini, jadisystemd
anggaplah maksud AndaType=simple
.Itu berarti
systemd
akan mengharapkan proses yang dimulai denganExecStart=
tetap berjalan selama layanan berjalan. Tapi sepertinya Andastart.sh
hanya menjalankan satu perintah dan kemudian keluar. Itulah yangforever
perintah :forever start
mulai perintah target sebagai daemon, atau dengan kata lain, di latar belakang. Segera setelahforever start
perintah selesai, shell runningstart.sh
akan keluar.Pada saat itu,
systemd
anggap layanan ini gagal. Tapi tunggu, grup kontrol yang ditugaskan untuk layanan itu masih memiliki proses yang berjalan di dalamnya. "Jadi," pikirsystemd
, "tidak hanya gagal, tetapi juga meninggalkan kekacauan setelahnya sendiri. Tidak dapat memilikinya." Karena tidak adaKillMode=
atau tidakKillSignal=
ditentukan,systemd
lanjutkan dengan default-nya dan kirimkan SIGTERM untuk setiap proses yang tersisa dalam grup kontrol itu, dan jika mereka tidak berhenti tepat waktu, lanjutkan dengan SIGKILL. Setelah itu, proses NodeJS Anda yang sebenarnya akan mati, dijamin.Bagaimana memperbaikinya
Karena perintah yang Anda jalankan
ExecStart=
akan keluar segera setelah server yang sebenarnya dimulai, Anda tidak dapat menggunakan defaultType=simple
. Anda harus menentukan jenis layanan lain.Anda bisa menggunakan
Type=forking
. Dengan tipe ini,man systemd.service
merekomendasikan menggunakanPIDFile=
opsi, jadi jika server NodeJS Anda membuat file PID untuk dirinya sendiri (atau Anda menambahkan opsi padaforever
perintah untuk membuatnya membuatnya untuk itu), Anda harus memberisystemd
tahu di mana itu akan berada.Jika
Type=forking
tidak bekerja untuk Anda, maka Anda dapat menentukanType=oneshot
denganRemainAfterExit=yes
.Itu
systemd
hanya menjalankanExecStart=
perintah ketika memulai layanan Anda danExecStop=
ketika menghentikannya, dan tidak peduli tentang hal lain.systemd
masih akan ingat apakah layanan terakhir kali diatur dalam keadaan berhenti atau mulai. Jadi jika Anda mengatur layanan lain untuk bergantung pada layanan ini, dan kemudian menghentikan layanan NodeJS Anda secara manual, layanan lainnya tidak akan berhenti secara otomatis dan tidak diragukan lagi akan mengembalikan kesalahan ketika tidak dapat menggunakan layanan NodeJS Anda.Opsi ketiga adalah untuk melewatkan
forever
perintah sepenuhnya dan biarkansystemd
melakukan pekerjaan memulai kembali proses NodeJS. Jika demikian, seluruhnodejs.service
unit Anda adalah:Anda bisa menambahkan opsi lain.
Misalnya, Anda dapat menentukan
RestartSec=5
untuk menentukan waktu tidur 5 detik sebelum mencoba memulai kembali layanan jika tiba-tiba mati, untuk menghindari sumber daya sistem yang memonopoli dengan upaya memulai kembali secara rutin jika layanan Anda terus sekarat segera setelah dimulai kembali karena suatu alasan. (Nilai defaultRestartSec=
adalah 100 ms.)Atau jika Anda ingin layanan di-restart jika mengembalikan beberapa nilai status keluar tertentu, tetapi menganggapnya gagal pada yang lain, ada opsi untuk itu juga.
sumber
Restart=always
file konfigurasi .service saya.