পরিবেশ-সেট এক্সিকিউটেবল পাথ সহ সিস্টেমড ইউনিট ফাইল রচনা করা


17

আমি একটি জাভা অ্যাপ্লিকেশনের জন্য একটি সিস্টেমড ইউনিট ফাইল লিখছি এবং আমি এটি চালু করতে ব্যবহৃত জাভাটির সংস্করণটি নিয়ন্ত্রণ করতে চাই। আমার (সরলীকৃত) পরিষেবা ফাইলটি

[Service]
Type=simple
EnvironmentFile=%h/Documents/apps/app/app-%i/app.cfg
ExecStart=${JAVA_HOME}/bin/java ${JAVA_OPTS} -jar %h/Documents/apps/app/app-%i/myapp.jar
SuccessExitStatus=143

এটি শুরু করার চেষ্টা করার সময় আমি একটি ত্রুটি ফিরে পেয়েছি

Apr 28 12:43:37 rombert systemd[1613]: [/home/robert/.config/systemd/user/app@.service:7] Executable path is not absolute, ignoring: ${JAVA_HOME}/bin/java ${JAVA_OPT
Apr 28 12:43:37 rombert systemd[1613]: app@1.0.0.service lacks both ExecStart= and ExecStop= setting. Refusing.

আমি জানি যে JAVA_HOMEসঠিকভাবে সেট করা আছে; আমি যদি ExecStartশুরু করার জন্য লাইনটি পরিবর্তন করি /usr/bin/javaএবং তারপরে এমন কিছু যুক্ত করি যা -DsomeOption=${JAVA_HOME}আমি ঠিক দেখতে পাচ্ছি।

সুস্পষ্ট কর্মসীমাটি একটি মোড়ক স্ক্রিপ্ট তৈরি করা তবে আমি অনুভব করি যে এটি কোনও পরিষেবা ফাইল ব্যবহারের বিন্দুটিকে পরাস্ত করে।

আমি কীভাবে আমার জাভা অ্যাপ্লিকেশনটির জন্য ইউনিট ফাইল ব্যবহার করে JAVA_Home সেট করতে পারি?


কেন র‌্যাপার স্ক্রিপ্টটি কোনও পরিষেবা ফাইল ব্যবহারের উদ্দেশ্যকে হ্রাস করে? আপনি এখনও সিস্টেমেড এর সিকোয়েন্সিং এবং নির্ভরতা ট্র্যাকিং, মনিটরিং ইত্যাদি পান। মূলত, সিস্টেমড বেক-ইন ডিটিআরটি যুক্তির পক্ষে সিসভিনেটের সাথে আমাদের ফ্রি-ফর্ম প্রোগ্রামেবলি মুক্ত করে । "ডান জিনিস" যখন সিস্টেমড কিছু না করে, তখন আপনাকে শেল স্ক্রিপ্টের মতো এটি বাইরের সিস্টেমে রাখা দরকার।
ওয়ারেন ইয়ং

@ ওয়ারেন ইয়ং - কারণ আমি হঠাৎ আবার শেল স্ক্রিপ্টগুলি পরিচালনা শুরু করি। আমার ক্ষেত্রে শেল স্ক্রিপ্ট পরিচালনা না করা অন্যান্য বিটগুলির চেয়ে বেশি কার্যকর।
রবার্ট মুন্তানু

আমি আসলেই সমস্যাটি দেখতে পাচ্ছি না। আপনি যে সমস্ত এক্সিকিউটেবলগুলি পরিচালনা করতে চান তা নিয়েও আপনার দিন কাটাতে হবে? :)
ওয়ারেন ইয়ং

3
Systemd.service (5) থেকে: "নোট করুন যে প্রথম আর্গুমেন্ট (অর্থাত্ কার্যকর করার প্রোগ্রাম) পরিবর্তনশীল নাও হতে পারে" " এটি ব্যাখ্যা করে যে কেন অ্যাপ্লিকেশন পাথের শুরুতে $ A জাভাহোম} প্রসারিত হয় না, তবে এটি পরে যখন ব্যবহৃত হয়।
উইল্যান্ড

@ ওয়ারেন ইয়ং - আমি বাইনারিগুলির উপরে একটি একক মোড়ক পছন্দ করি। আমি বুঝতে পারি যে এটি সবার কাছে সমস্যা নয়, তবে এটি আমার জন্য :-)
রবার্ট মুন্তানু

উত্তর:


12

Systemdservices (5) এর "কমান্ড লাইন" বিভাগ থেকে:

মনে রাখবেন যে প্রথম আর্গুমেন্ট (অর্থাত্ কার্যকর করার জন্য প্রোগ্রাম) পরিবর্তনশীল নাও হতে পারে।

আমি উদাহরণ সুনির্দিষ্ট ব্যবহার করে পরামর্শ দিতে যাচ্ছিলাম %i(আপনি এটি সম্পর্কে systemd.unit (5%) তে আরও পড়তে পারেন, তবে (এখন আমরা সিস্টেমডে। সার্ভিস ফিরে এসেছি (5)):

কমান্ড লাইনের প্রথম আর্গুমেন্টে (অর্থাত্ কার্যকর করার প্রোগ্রামটি) নির্দিষ্টকারীদের অন্তর্ভুক্ত নাও করতে পারে।

আমি মনে করি এই মুহুর্তে সর্বোত্তম বিকল্পটি শেল স্ক্রিপ্ট তৈরি করছে যা ওয়ার্ন ইয়ংয়ের পরামর্শ অনুসারে জাভা বাইনারি কার্যকর করে দেয় বা আপনি "কমান্ড লাইনস" বিভাগের শেল কমান্ড লাইনের উদাহরণের মতো শেলকে সরাসরি স্টার্ট করতে পারেন could systemd.service (5) যার নিম্নলিখিত উদাহরণ রয়েছে:

ExecStart=/bin/sh -c 'dmesg | tac'

যাতে আপনি (অনির্ধারিত) করতে পারেন:

ExecStart=/bin/sh -c '${JAVA_HOME}....'

2

অন্য অনুরূপ বিকল্পটি হ'ল /usr/bin/env:

ExecStart=/usr/bin/env "${JAVA_HOME}/bin/java" -jar ...

এইভাবে আপনি 'পুরো কমান্ডের চারপাশে উদ্ধৃতিগুলি বাদ দিতে পারেন যা আপনার যদি উদ্ধৃত স্টাফগুলি বাসা বাঁধতে হয় তবে তা কার্যকর।

পুনশ্চ. পার্শ্ব নোট হিসাবে, সিস্টেমড ফাইলগুলিতে {ধনুর্বন্ধনীগুলিতে পরিবর্তনশীল নামগুলি বন্ধ করা গুরুত্বপূর্ণ, }অন্যথায় সেগুলি সঠিকভাবে স্বীকৃত হবে না।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.