मैं यह कैसे पता लगाऊंगा कि मेरी व्यवस्थित सेवा CentOS 7 पर शुरू क्यों नहीं हुई?


12

मैं CentOS 7 का उपयोग कर रहा हूं। मुझे कैसे पता चलेगा कि कोई सेवा शुरू करने में विफल क्यों है? मैंने यह सेवा बनाई है

[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

फाइल इस ओर इशारा करती है

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

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

मैं इस फ़ाइल को अपने आप ही ठीक चला सकता हूं। लेकिन जब मैं कोशिश करता हूं और इसे सेवा के हिस्से के रूप में चलाता हूं, तो मुझे लगता है कि मेरा नोडज सर्वर शुरू नहीं हुआ है। यहां तक ​​कि जब मैं "sudo systemctl --state = fail" की जांच करता हूं, तो मुझे कोई त्रुटि नहीं दिखती ...

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

मैं कैसे पता लगाऊं कि मेरी सेवा शुरू करने में विफल क्यों हुई?


journalctl -u nodejsआपको अधिक सार्थक त्रुटि संदेश देना चाहिए।
फेडेरिको क्लेज़ कुल्लोक

मुझे संदेश मिलता है "कोई पत्रिका फ़ाइलें नहीं मिलीं।"
डेव

सुडोल जर्नलक्ट को काम करना चाहिए। स्टार्ट के भीतर भी देखें कि क्या यह आउटपुट लॉग फाइल को कहीं और रीडायरेक्ट कर रहा है।
रॉगरडैक

जवाबों:


13

आपकी सेवा में अनुभाग Type=में कोई निर्दिष्ट नहीं है [Service], इसलिए systemdआप का मतलब है Type=simple

इसका मतलब systemdहै कि ExecStart=जब तक सेवा चालू रहेगी, तब तक चलने वाली प्रक्रिया से उम्मीद की जाएगी । लेकिन ऐसा लगता है कि आपका start.shकेवल एक कमांड चलाता है और फिर बाहर निकलता है। यही कारण है आदेश : एक डेमॉन के रूप में लक्ष्य आदेश शुरू होता है, या दूसरे शब्दों में, पृष्ठभूमि में। जैसे ही कमांड पूरी होगी, शेल रनिंग बाहर निकल जाएगी।foreverforever startforever startstart.sh

उस समय, systemdइस सेवा को विफल मानता है। लेकिन रुकिए, उस सेवा के लिए सौंपे गए नियंत्रण समूह में अभी भी एक प्रक्रिया चल रही है। "तो," सोचता है systemd, "न केवल यह विफल रहा, बल्कि इसने खुद के बाद भी एक गड़बड़ छोड़ दी। ऐसा नहीं हो सकता।" चूँकि कोई निर्दिष्ट नहीं है KillMode=और न ही KillSignal=निर्दिष्ट है, systemdअपनी चूक के साथ जाता है और उस नियंत्रण समूह में किसी भी शेष प्रक्रियाओं के लिए एक SIGTERM भेजता है, और यदि वे समय पर नहीं रुकते हैं, तो SIGKILL के साथ अनुसरण करता है। उसके बाद, आपकी वास्तविक NodeJS प्रक्रिया मृत, गारंटीकृत होगी।

इसे कैसे जोड़ेंगे

चूंकि आप जिस कमांड के साथ चलते हैं, ExecStart=वह जैसे ही वास्तविक सर्वर शुरू होता है, आप डिफ़ॉल्ट का उपयोग नहीं कर सकते Type=simple। आपको एक अन्य सेवा प्रकार निर्दिष्ट करना होगा।

आप उपयोग कर सकते हैं Type=forking। इस प्रकार के साथ, man systemd.serviceएक PIDFile=विकल्प का उपयोग करने की अनुशंसा करता है, इसलिए यदि आपका NodeJS सर्वर खुद के लिए एक पीआईडी ​​फ़ाइल बनाता है (या आप foreverइसे इसके लिए एक बनाने के लिए कमांड में विकल्प जोड़ते हैं ), तो आपको systemdपता होना चाहिए कि यह कहां होगा।

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

यदि Type=forkingआपके लिए काम नहीं करता है, तो आप के Type=oneshotसाथ निर्दिष्ट कर सकते हैं RemainAfterExit=yes

यह आपकी सेवा शुरू करते समय और इसे रोकते समय systemdकेवल ExecStart=कमांड चलाता ExecStop=है, और किसी और चीज की परवाह नहीं करता है।

systemdअभी भी याद रखना होगा कि सेवा अंतिम रूप से बंद या शुरू की गई अवस्था में थी, हालाँकि। इसलिए यदि आप इस सेवा पर निर्भर होने के लिए कोई अन्य सेवा सेट करते हैं, और फिर अपनी नोड्स सेवा को मैन्युअल रूप से बंद कर देते हैं, तो दूसरी सेवा स्वतः बंद नहीं होगी और जब आपकी NodeJS सेवा का उपयोग नहीं किया जा सकता तो इसमें कोई संदेह नहीं होगा।


तीसरा विकल्प यह है कि foreverकमांड को पूरी तरह से छोड़ दें और systemdNodeJS प्रक्रिया को फिर से शुरू करने का काम करें। उस स्थिति में, आपकी पूरी nodejs.serviceइकाई होगी:

[Unit]
Description=nodejs server

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

[Install]
WantedBy=multi-user.target

आप अन्य विकल्प जोड़ सकते हैं।

उदाहरण के लिए, यदि आप RestartSec=5अप्रत्याशित रूप से मर जाते हैं, तो सेवा संसाधनों को फिर से शुरू करने से बचने के लिए 5-सेकंड की नींद को निर्दिष्ट करने के लिए निर्दिष्ट कर सकते हैं , यदि लगातार किसी कारण से पुनरारंभ होने के तुरंत बाद आपकी सेवा मर जाती है, तो सिस्टम संसाधनों को हॉगिंग से बचने के लिए। (डिफ़ॉल्ट RestartSec=मान 100 एमएस है।)

या यदि आप चाहते हैं कि सेवा को फिर से शुरू किया जाए यदि यह कुछ विशिष्ट निकास स्थिति मान लौटाता है, लेकिन विचार करें कि यह दूसरों पर विफल है, तो उसके लिए भी विकल्प हैं।


मेरे पास एक ऐसी सेवा थी जो रोक नहीं रही थी, और ठीक से शुरू नहीं होगी (यह शुरू होती है, लेकिन व्यवस्थित प्रक्रिया कभी भी बाहर नहीं निकलती है)। बस मुझे उस मामले में जोड़ना है, मुझे जो कुछ भी करने की ज़रूरत है वह Restart=alwaysमेरे .s config फ़ाइल में जोड़ें ।
एंडी फोर्केनो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.