सिस्टमैड सेवा टाइमआउट मान कैसे बदलें?


33

जिस कंपनी में मैं अभी काम कर रहा हूँ, वहाँ एक विरासत सेवा है और इसकी init स्क्रिप्ट पुराने SysvInit का उपयोग कर रही है, लेकिन सिस्टमड (7 CentOS) पर चल रही है।

क्योंकि बहुत अधिक संगणना है, इस सेवा को समाप्त होने में लगभग 70 सेकंड लगते हैं। मैंने सिस्टमड के लिए कोई टाइमआउट कॉन्फ़िगर नहीं किया था, और डिफ़ॉल्ट कॉन्फिग को नहीं बदला था /etc/systemd/system.conf, लेकिन फिर भी जब मैं service SERVICE stopअपनी सेवा को निष्पादित करता हूं तो 60 सेकंड के लिए समय समाप्त हो जाता है।

साथ जाँच हो रही है journalctl -b -u SERVICE.serviceमैं इस लॉग पाते हैं:

Sep 02 11:27:46 service.hostname systemd[1]: Stopping LSB: Start/Stop
Sep 02 11:28:46 service.hostname SERVICE[24151]: Stopping service: Error code: 255
Sep 02 11:28:46 service.hostname SERVICE[24151]: [FAILED]

मैं पहले से ही बदल रहा है की कोशिश की DefaultTimeoutStopSecपर संपत्ति /etc/systemd/system.confके लिए 90sहै, लेकिन अभी भी समय समाप्त होता है।

क्या किसी को कोई विचार नहीं है कि वह 60 के दशक में क्यों टाइमआउट कर रहा है? कहीं और है कि यह टाइमआउट मान कॉन्फ़िगर किया गया है? क्या कोई तरीका है जो मैं इसकी जांच कर सकता हूं?

यह सेवा जावा 7 के साथ चलती है और इसे निष्क्रिय करने के लिए, यह JSVC का उपयोग करता है । मैंने -waitमान के साथ पैरामीटर कॉन्फ़िगर किया है 120

जवाबों:


54

मेरी सिस्टम सेवा ने समय निकाल कर रखा है क्योंकि इसे बूट होने में कितना समय लगेगा, इसलिए इसने मेरे लिए इसे निर्धारित किया:

  1. अपनी सिस्टमड फ़ाइल संपादित करें:
    • के आधुनिक संस्करणों के लिएsystemd : भागो systemctl edit --full node.service( अपने सेवा नाम के साथ "नोड" बदलें )।
      • यह एक सिस्टम फाइल बनाएगा जो सिस्टम फाइल /etc/systemd/system/node.service.d/को ओवरराइड करेगा /usr/lib/systemd/system/node.service। यह आपके सिस्टम फ़ाइलों को कॉन्फ़िगर करने का उचित तरीका है। के बारे में कैसे उपयोग करने के लिए अधिक जानकारी systemctl editहै यहाँ
    • सीधे एडिटिंग सिस्टम फाइल : मेरे लिए सिस्टम फाइल ऑन है /usr/lib/systemd/system/node.service। "नोड" को अपने आवेदन नाम से बदलें। हालाँकि, फ़ाइलों को सीधे संपादित करना सुरक्षित नहीं है /usr/lib/systemd/(टिप्पणियां देखें)
  2. का प्रयोग करें TimeoutStartSec, TimeoutStopSecया TimeoutSec(अधिक जानकारी यहाँ ) निर्दिष्ट करने के लिए कितनी देर तक टाइमआउट शुरू करने और प्रक्रिया को रोकने के लिए किया जाना चाहिए। बाद में, इस तरह से मेरी systemd फ़ाइल देखी गई:

    [Unit]
    Description=MyProject
    Documentation=man:node(1)
    After=rc-local.service
    
    [Service]
    WorkingDirectory=/home/myproject/GUIServer/Server/
    Environment="NODE_PATH=/usr/lib/node_modules"
    ExecStart=-/usr/bin/node Index.js
    Type=simple
    Restart=always
    KillMode=process
    TimeoutSec=900
    
    [Install]
    WantedBy=multi-user.target
    
    • आप इनमें से किसी को भी चलाकर वर्तमान टाइमआउट स्थिति देख सकते हैं (लेकिन आपको बदलाव करने के लिए अपनी सेवा को संपादित करना होगा! चरण 1 देखें):
      • systemctl show node.service -p TimeoutStartSec
      • systemctl show node.service -p TimeoutStopSec
      • systemctl show node.service -p TimeoutSec
  3. इसके बाद आपको सिस्टमड को फिर से लोड करना होगा systemctl reload node.service
  4. अब के साथ अपनी सेवा शुरू करने का प्रयास करें systemctl start node.service
  5. यदि वह काम नहीं करता है , तो systemctl को रीबूट करने का प्रयास करेंsystemctl reboot
  6. यदि वह काम नहीं किया था , का उपयोग करके देखें --no-blockतो जैसे systemctl के लिए विकल्प: systemctl --no-block start node.service। यह विकल्प यहां वर्णित है : "सिंक्रनाइज़ किए गए ऑपरेशन के समाप्त होने का इंतजार न करें। यदि यह निर्दिष्ट नहीं किया गया है, तो नौकरी को सत्यापित किया जाएगा, संलग्न और systemctl तब तक इंतजार करेगा जब तक कि यूनिट का स्टार्ट-अप पूरा न हो जाए। इस तर्क को पारित करके, यह। केवल सत्यापित और संलग्न है। "
    • systemctl maskइसके बजाय उपयोग करने का विकल्प भी है systemctl start। अधिक जानकारी के लिए यहां देखें ।

टिप्पणियाँ से अपडेट:

  • TimeoutSec=infinity: यहां "अनंत" का उपयोग करने के बजाय, बड़ी मात्रा में समय डालें, जैसे TimeoutSec=900(15 मिनट)। यदि आवेदन बाहर निकलने के लिए "हमेशा के लिए" लेता है, तो यह संभव है कि यह अनिश्चित काल के लिए एक रिबूट को अवरुद्ध करेगा। क्रेडिट @ एलेक्सिस विल्के और @ जेसीसीवाईसी
  • संपादन करने के बजाय /usr/lib/systemd/system, की कोशिश systemctl editके बजाय या संपादित /etc/systemd/systemबजाय उन्हें ओवरराइड करने के लिए। आपको कभी भी सेवा फ़ाइलों को संपादित नहीं करना चाहिए /usr/lib/। क्रेडिट @ryeager और @ 0xC0000022L

8
TimeoutSec=infinity- क्या यह संभव नहीं होगा कि यह एक रिबूट को अनिश्चित काल के लिए ब्लॉक कर दे? क्या होगा अगर यह उस प्रक्रिया से बाहर निकलने के लिए "हमेशा के लिए" लेता है? मैं एक बड़ी राशि का सुझाव देता हूं, जैसे 5min, लेकिन शायद नहीं infinity...
एलेक्सिस विल्के

6
आपको / usr / lib में सेवा फ़ाइलों का संपादन नहीं करना चाहिए, आपको उन्हें संपादित करना चाहिए या उन्हें / etc / systemd / system में ओवरराइड करना चाहिए
ryeager

5
जबकि सलाह का सार ध्वनि है, मुझे उस बहुत उद्देश्य के लिए @ryeager ... systemdप्रस्ताव के आधुनिक संस्करणों systemctl edit(और maskउन्हें क्रूरता के साथ अक्षम करने के लिए, विरोध के रूप में disable) के साथ संक्षिप्त करना होगा। आपको कभी भी फ़ाइलों को संपादित नहीं करना चाहिए /usr/lib/systemd
0xC0000022L

3
TimeoutSec=infinityयहाँ काम नहीं किया, मैंने TimeOutSec=900(15 मिनट) इस्तेमाल किया और इससे मेरा पद बच गया। - मुझे systemctl daemon-reloadसेवा को फिर से शुरू करने से पहले, बाद में चलाने की आवश्यकता है ।
JCCyC

10

रनिंग systemctl show SERVICE_NAME.service -p TimeoutStopUSecमैं कम से कम मेरी सेवा के लिए systemd द्वारा निर्धारित टाइमआउट देख सकता था।

मैंने स्क्रिप्ट को एक नियमित इकाई फ़ाइल में बदल दिया, ताकि वह ठीक से काम कर सके।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.