কেন আমার সিস্টেমটেল পরিষেবাটি সেন্টোস 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 = ব্যর্থ" পরীক্ষা করি তখনও আমি কোনও ত্রুটি দেখতে পাই না ...

[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আপনাকে আরও অর্থপূর্ণ ত্রুটি বার্তা দেওয়া উচিত।
ফেডেরিকো ক্লেজ কুলোকা

আমি "কোনও জার্নাল ফাইল খুঁজে পাওয়া যায় নি" বার্তাটি পাই।
ডেভ

sudo জার্নাক্টেল কাজ করা উচিত। এছাড়াও start.sh এর মধ্যে দেখুন কি এটি অন্য কোথাও আউটপুট লগ ফাইলগুলি পুনঃনির্দেশ করছে।
রজারডপ্যাক

উত্তর:


13

আপনার পরিষেবাটি বিভাগে Type=নির্দিষ্ট করা হয়নি [Service], সুতরাং systemdধরে নিন আপনি বোঝাতে চেয়েছিলেন Type=simple

এর অর্থ পরিষেবাটি যতক্ষণ চলমান থাকবে চালিয়ে systemdযাওয়া প্রসেসটি প্রত্যাশা করবে ExecStart=। তবে দেখে মনে হচ্ছে আপনার start.shএকমাত্র কমান্ড চালায় এবং তারপরে বাইরে চলে যায়। যে কমান্ড : একটি ডেমন যেমন লক্ষ্য কমান্ড আরম্ভ করা হয়, অথবা অন্য কথায়, ব্যাকগ্রাউন্ডে। যত তাড়াতাড়ি কমান্ড সম্পূর্ণ হলে, শেল চলমান বেরিয়ে যাবেন।foreverforever startforever startstart.sh

এই মুহুর্তে, systemdএই পরিষেবাটিকে ব্যর্থ হিসাবে বিবেচনা করে। তবে অপেক্ষা করুন, সেই পরিষেবার জন্য নির্ধারিত নিয়ন্ত্রণ গোষ্ঠীর এখনও এটির চলমান প্রক্রিয়া রয়েছে। "সুতরাং," মনে করে systemd, "এটি কেবল ব্যর্থ হয় নি, এটি নিজে থেকে পরেও গোলমাল ফেলেছিল that এটি থাকতে পারে না।" যেহেতু কোনও নির্দিষ্ট KillMode=বা KillSignal=সুনির্দিষ্ট নয়, systemdতার ডিফল্টগুলি নিয়ে চলে যায় এবং সেই নিয়ন্ত্রণ গোষ্ঠীতে থাকা কোনও অবশিষ্ট প্রক্রিয়াগুলির জন্য একটি সিগমেন্টার প্রেরণ করে এবং যদি তারা সময়োপযোগীভাবে না থামায়, একটি সিক্কিলের সাথে অনুসরণ করে। এর পরে, আপনার আসল নোডজেএস প্রক্রিয়াটি মারা যাবে, গ্যারান্টিযুক্ত।

কিভাবে এটা মেরামত করা যেতে পারে

যেহেতু আপনি যে কমান্ডটি চালাচ্ছেন ExecStart=তা প্রকৃত সার্ভার শুরু হওয়ার সাথে সাথেই প্রস্থান করবে, আপনি ডিফল্টটি ব্যবহার করতে পারবেন না Type=simple। আপনাকে অবশ্যই অন্য একটি পরিষেবার ধরণ উল্লেখ করতে হবে।

আপনি ব্যবহার করতে পারেন Type=forking। এই ধরণের man systemd.serviceসাহায্যে একটি PIDFile=বিকল্প ব্যবহার করার পরামর্শ দেয় , সুতরাং আপনার নোডজেএস সার্ভার যদি নিজের জন্য একটি পিআইডি ফাইল তৈরি করে (বা আপনি 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এখনও পরিষেবাটি বন্ধ হওয়া বা শুরু হওয়া অবস্থায় সেট করা হয়েছিল কিনা তা এখনও মনে রাখবে, যদিও। সুতরাং আপনি যদি এই পরিষেবাটির উপর নির্ভর করতে অন্য কোনও পরিষেবা সেট করেন এবং তারপরে নিজের নোডজেএস পরিষেবাটি ম্যানুয়ালি বন্ধ করে দেন, অন্য পরিষেবাটি স্বয়ংক্রিয়ভাবে বন্ধ হবে না এবং কোনও সন্দেহ নেই যে এটি আপনার নোডজেএস পরিষেবাটি ব্যবহার করতে না পারলে ত্রুটি ফিরে আসবে no


তৃতীয় বিকল্পটি হ'ল foreverকমান্ডটি পুরোপুরি বাদ দেওয়া systemdএবং নোডজেএস প্রক্রিয়াটি পুনরায় চালু করার কাজটি করা যাক । 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আমার .service কনফিগারেশনের ফাইলটিতে যুক্ত করা।
অ্যান্ডি ফোর্সনো 4'19
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.