সিস্টেমযুক্ত সাথে জাভা ডিমন কনফিগার করুন


11

আমি এই সংজ্ঞাটি একটি systemdকাজের জন্য ব্যবহার করছি :

 [Unit]
 Description=Some job

 [Service]
 ExecStart=/usr/local/sbin/somejob
 User=dlt
 Type=forking

 [Install]
 WantedBy=multi-user.target

স্ক্রিপ্টটি নিম্নরূপে বলা হয় (একটি সাধারণ রুটিনকে কল করা যা একটি টিসিপিপ সকেটে শোনে এবং কোনও ফাইলে ইনপুট সংযোজন করে):

 #!/bin/sh

 cd /home/user/tmp/testout
 nohup java -jar /home/user/programming/tests/java/core/SocketTest/SocketTest.jar </dev/null >/dev/null &

systemctl start somejobপ্রক্রিয়াটি চলমান হিসাবে চালিত হওয়ার পরে , initএর পিতামাতার মতো:

 user@CANTANDO ~$ ps -u dlt eo pid,ppid,command
   PID  PPID COMMAND
  8718     1 java -jar /home/user/programming/tests/java/core/SocketTest/SocketTest.jar

systemctl stop somejobপ্রক্রিয়াটি সম্পাদন করার পরে আর দেখাবে না (এবং পোর্টটি বন্ধ রয়েছে)।

তাই সবকিছু সুন্দর এবং জঘন্য মনে হয়

আমার প্রশ্নটি হ'ল: এটি কোনও জাভা ডেমন দিয়ে চালানোর জন্য কি গ্রহণযোগ্য সমাধানsystemd , বা সেখানে সতর্কতা রয়েছে এবং এর ফলে এটি অর্জনের পথে আরও আরও স্থিতিশীল বা সুরক্ষিত উপায় রয়েছে?

উত্তর:


14

এখানে কিছু ছোটখাট পরিবর্তন রয়েছে:

  1. যেহেতু এটি কোনও নেটওয়ার্ক সকেটে শোনা যায়, তাই এটির একটি নির্ভরতা তৈরি করুন network.target
  2. nohupআপনার জন্য systemdএক্সিকিউটেবলকে গণ্য করা হবে না needed
  3. আমি মনে করি একটি পৃথক শেল স্ক্রিপ্ট একটি ওভারকিল হবে, সুতরাং কেবল এটি পরিষেবা ফাইলে মার্জ করুন।
  4. পুনঃনির্দেশ ( < /dev/nullএবং আরও) প্রয়োজন নেই যেহেতু systemd একটি উপযুক্ত মান I / O প্রসঙ্গ সেট আপ করে। প্রকৃতপক্ষে, আপনি যদি পুনঃনির্দেশটি আউট করেন তবে সিস্টেমড জাভা প্রোগ্রাম দ্বারা প্রমিত আউটপুটে পাঠানো যে কোনও কিছুকে তার জার্নালে লগ করবে, বিশেষ লগিংয়ের কোনও প্রয়োজন নেই।
  5. ইনভোকেটিং শেল ( &) থেকে অ্যাসিঙ্কনোয়ালি চালানো প্রয়োজন বা উপযুক্ত নয়।
  6. একটি নির্দিষ্ট আচরণের প্যাটার্ন দ্বারা প্রয়োজনীয় আবশ্যক Type=forking, এবং যদি এটি ডমন বিষয়গুলি অনুসরণ না করে তবে ভুল হয়ে যায়। সুতরাং Type=simple(বা Type=notify) জন্য চেষ্টা করুন ।

সুতরাং পরিষেবা ফাইলটি এর মতো দেখাচ্ছে:

[Unit]
Description=Some job
After=network.target

[Service]
WorkingDirectory=/home/user/tmp/testout
SyslogIdentifier=SocketTest
ExecStart=/bin/sh -c "exec java -jar /home/user/programming/tests/java/core/SocketTest/SocketTest.jar"
User=dlt
Type=simple

[Install]
WantedBy=multi-user.target

মন্তব্য:

  1. আপনি javaচালানোর জন্য প্রোগ্রামটির নাম হিসাবে ব্যবহার করতে পারবেন না । systemd PATHএক্সিকিউটেবলের জন্য অনুসন্ধান করে না এবং প্রদত্ত এক্সিকিউটেবলের নাম ExecStartঅবশ্যই নিরঙ্কুশ be সুতরাং আপনি যদি পাথ সন্ধান করতে চান তবে আপনাকে শেল বা মাধ্যমে যেতে হবে /usr/bin/env। আমরা /bin/shএখানে নির্বাচন ।
  2. কারণ Type=simpleএটি শেলটি অবশ্যই execজাভা, এটি শিশু প্রক্রিয়া হিসাবে চালাবেন না। systemd মূল প্রক্রিয়াটির মাধ্যমে পরিষেবা নিয়ন্ত্রণ করে এবং এটি জাভা হওয়া দরকার, প্যারেন্ট শেল প্রক্রিয়া নয়।
  3. যেহেতু এটি সরাসরি জাভা এক্সিকিউটেবলকে ডাকে না, সিস্টেমড shতার জার্নালে নামটি পরিষেবার নাম হিসাবে রাখবে। এর থেকে আরও কার্যকর করার জন্য সিস্টেমড লগগুলিতে চিহ্নিত হওয়া / usr / bin / env এড়াতে কীভাবে দেখুন ।

যতদূর আমি জানি, সিস্টেমডের সাথে জাভা অ্যাপ্লিকেশন চালানোর কোনও বিশেষ সতর্কতা নেই।


1
যে কাজ করবে না। সমস্যা 1: এটি শেল নয়; কোনও পুনঃনির্দেশ অপারেটর নেই। আপনি যেভাবে যাইহোক সত্যিই সেই পুনঃনির্দেশটি চান না। সমস্যা 2: এক্সিকিস্টার্ট নিখুঁত পাথর নামগুলির দাবি করে। সমস্যা 3: unix.stackexchange.com/questions/229523
জেডিবিপি

ভাল মাথা উপরে। আমি কেবল সমস্যা 1 ঠিক করতে পরিচালনা করতে পারি। আপনি প্রোব 2,3 ঠিক করার বিষয়ে কীভাবে যাবেন?
ইউন-চিহ চেন

1
উত্তরটি সম্পাদিত হিসাবে দেখুন।
জেডিবিপি

আমি মনে করি না যে শ এখানে প্রয়োজনীয়।
ফাহো

হ্যালো @ ইউন-চিহচেন আপনি কীভাবে প্রক্রিয়াটি বন্ধ করেন। এক্সেকস্ট্রপ দেখতে কেমন হবে? আমি পিড ফাইলের সাথে init.d ব্যবহার করছি তবে এটি আরও সহজ খুঁজে পেয়েছি। তাই আমি নিশ্চিত করা প্রয়োজন আমি জানি বন্ধ করার কিভাবে ইত্যাদি ধন্যবাদ
কালো Sensei
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.