Systemctl hizmetimin neden CentOS 7'de başlamadığını nasıl anlayabilirim?


12

CentOS 7 kullanıyorum. Bir hizmetin neden başlatılamadığını nasıl anlarım? Bu hizmeti yarattım

[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

Dosya buna işaret ediyor

[rails@server ~]$ cat /home/rails/NodeJSserver/start.sh
#!/bin/bash

forever start /home/rails/NodeJSserver/server.js

Bu dosyayı tek başına çalıştırabilirim. Ancak hizmetin bir parçası olarak çalıştırmayı denediğimde nodeJS sunucumun başlamadığını fark ettim. "Sudo systemctl --state = başarısız oldu" seçeneğini işaretlesem bile hata görmüyorum ...

[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'.

Hizmetimin neden başlatılamadığını nasıl anlarım?


journalctl -u nodejssize daha anlamlı bir hata mesajı vermelidir.
Federico klez Culloca

"Günlük dosyası bulunamadı" mesajını alıyorum.
Dave

sudo journalctl çalışmalı. Ayrıca start.sh içinde çıktı günlük dosyalarını başka bir yere yönlendirip yönlendirmediğine bakın.
rogerdpack

Yanıtlar:


13

Hizmetinizde bölüm Type=belirtilmedi [Service], bu nedenle systemddemek istediğinizi varsayalım Type=simple.

Bu systemd, başlatılan işlemin ExecStart=hizmet çalıştığı sürece çalışmaya devam edeceği anlamına gelir . Ama görünüşe göre start.shsadece bir komut çalıştırıyorsunuz ve çıkılıyor. Yani komut : Arka planda, bir servis olarak, hedef komutunu başlatır veya başka bir deyişle. En kısa sürede komut tamamlanıncaya, kabuk koşu çıkılacak.foreverforever startforever startstart.sh

Bu noktada, systemdbu hizmeti başarısız olarak görür. Ancak bekleyin, bu hizmet için atanan kontrol grubunun içinde hala çalışan bir işlem vardır. "Öyleyse," diye düşünüyor systemd, "sadece başarısız olmakla kalmadı, aynı zamanda kendi başına bir karmaşa bıraktı. Buna sahip olamaz." Hiçbir olmadığı için KillMode=ne de KillSignal=belirtilen, systemdkendi varsayılan ile devam eder ve bu kontrol grubunda kalan süreçleri için bir SIGTERM gönderir ve onlar zamanında kesmezsen, bir SIGKILL ile takip eder. Bundan sonra, gerçek NodeJS süreciniz ölü olacak, garanti edilecek.

Nasıl düzeltilir?

ExecStart=Gerçek sunucu başlatılır başlatılmaz çalıştırdığınız komut çıkacağı için varsayılanı kullanamazsınız Type=simple. Başka bir hizmet türü belirtmelisiniz.

Kullanabilirsiniz Type=forking. Bu tür man systemd.servicebir PIDFile=seçenek kullanmanızı önerir , bu nedenle NodeJS sunucunuz kendisi için bir PID dosyası oluşturursa (veya foreverkomut için bir dosya oluşturmasını sağlamak üzere seçenekler eklerseniz ), systemdnerede olacağını bilmelisiniz.

[Service]
Type=forking
PIDFile=/absolute/path/to/nodejs.pid
User=rails
... <the rest as before>

Eğer Type=forkingsizin için çalışmaz, o zaman belirtebilirsiniz Type=oneshotile RemainAfterExit=yes.

Bu, hizmetinizi başlatırken ve durdururken komutu systemdçalıştırmanızı sağlar ve başka bir şeyle ilgilenmez.ExecStart=ExecStop=

systemdyine de hizmetin son durdurulmuş veya başlatılmış durumda olup olmadığını hatırlar. Bu nedenle, başka bir hizmeti bu hizmete bağlı olacak şekilde ayarlarsanız ve sonra NodeJS hizmetinizi el ile durdurursanız, diğer hizmet otomatik olarak durmaz ve NodeJS hizmetinizi kullanamadığında hata döndürmez.


Üçüncü seçenek, foreverkomutu tamamen atlamak systemdve NodeJS işlemini yeniden başlatma işini yapmasıdır. Bu durumda, tüm nodejs.serviceüniteniz:

[Unit]
Description=nodejs server

[Service]
User=rails
Group=rails
ExecStart=/home/rails/NodeJSserver/server.js
Restart=always

[Install]
WantedBy=multi-user.target

Başka seçenekler de ekleyebilirsiniz.

Örneğin, RestartSec=5herhangi bir nedenle yeniden başlatıldıktan hemen sonra ölmeye devam ederse, sistem kaynaklarının sık sık yeniden başlatma girişimleriyle uğraşmasını önlemek için beklenmedik bir şekilde ölürse hizmeti yeniden başlatmaya çalışmadan önce 5 saniyelik bir uyku belirtmeyi belirtebilirsiniz. (Varsayılan RestartSec=değer 100 ms'dir.)

Veya hizmetin belirli bir çıkış durumu değerleri döndürmesi durumunda yeniden başlatılmasını istiyorsanız, ancak başkalarında başarısız olduğunu düşünürseniz, bunun için de seçenekler vardır.


Ben durmayan bir hizmet vardı ve düzgün başlamazdı (başlar, ama systemctl işlemi asla çıkar). Sadece benim durumumda eklemek istiyorum, tek yapmam gereken Restart=always.service yapılandırma dosyama eklemek oldu.
Andy Forceno
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.