systemd - আমার পরিষেবা একাধিক যুক্তি দেওয়া


44

আমার সিস্টেমেড পরিষেবাটি কি একাধিক যুক্তি দেওয়া সম্ভব?

আমি একাধিক যুক্তিযুক্ত একটি প্রোগ্রাম সম্পাদন করতে চাই যা চূড়ান্ত ব্যবহারকারীর দ্বারা সিদ্ধান্ত নেওয়া উচিত।

উদাহরণ: ./program arg1 arg2

এটি একটি একক আর্গুমেন্ট অ্যাপ্লিকেশন শুরু করতে আমার এমন কিছু দরকার systemctl start arg1@program, যেখানে আমার পরিষেবা সংজ্ঞা রয়েছে ExecStart = /usr/bin/program ℅i

ধন্যবাদ!


1
আপনি যা চান তা কনফিগার ফাইল হিসাবে লাগে।
ড্যানিয়েল বি

আমি যেতে যেতে এটি পরিবর্তন করা প্রয়োজন। আমার কি কঠোরভাবে কনফ ফাইলের দরকার?
পেপারুনাস

@ পেপারুনস আপনার কোনও কনফাইব ফাইলের দরকার নেই, আমার উত্তরটি দেখুন যা কোনও অতিরিক্ত ফাইল ছাড়াই কাজ করে
নোনাগন

উত্তর:


34

হ্যা, তুমি পারো! এগুলি কোথাও একটি ফাইলে সংজ্ঞায়িত করুন এবং এগুলি EnvironmentFileআপনার সিস্টেমড পরিষেবায় যুক্ত করুন । উদাহরণস্বরূপ, /etc/.progconf এর সামগ্রীগুলি বলুন:

ARG1=-o
ARG2=--verbose

এবং আপনার .service ফাইল:

EnvironmentFile=/etc/.progconf
ExecStart = /usr/bin/prog $ARG1 $ARG2

চলতে চলতে যদি এগুলি পরিবর্তন করতে হয় তবে আপনি সেই ফাইলটিতে লিখতে পারেন। কোনও পরিষেবাদি তার প্রায়শই তার বিকল্পগুলি পরিবর্তন করতে পারে না, যদি আপনার এটি অর্জন করার প্রয়োজন হয় তবে অটোস্টার্টিং বা ক্রোনকে বিবেচনা করুন।

আরও উদাহরণের জন্য পরীক্ষা করুন: https://wiki.archlinux.org/index.php/Sstmd/Services


হাহ, বেশ সহজ, ভেবে দেখেনি। যদিও আমাকে সম্মত হতে হবে: পরিষেবা পরামিতিগুলি নিয়মিতভাবে পরিবর্তন হয় না এবং তাদের কনফিগার ফাইলগুলিও করে না।
ড্যানিয়েল বি

যদি সার্ভিস ফাইলটি পরিবেশের ভেরিয়েবলগুলি ব্যবহার করে, আপনি কি VAR1=... VAR2=... systemctl start foobar.serviceভেরিয়েবলগুলি পাস করতে বলতে পারেন?
জোহানেস স্কাউব - লিটব

হ্যাঁ, আমি বিশ্বাস করি আপনি এটি করতে পারেন
প্ল্যাটফর্ম

6
@ জোহানেস শ্যাব-লিটব, না, আপনি পারবেন না। একটা হল PassEnvironmentডিরেক্টিভের, কিন্তু এটা থেকে ভেরিয়েবল লাগে systemdনা থেকে প্রক্রিয়া (সাধারণত PID, 1), systemctlsystemctlপ্রক্রিয়াটি থেকে পরিবেশের ভেরিয়েবলগুলি পরিষেবাটি শুরু হওয়ার পথে প্রচারিত হবে না।
সিজেএম

2
তবে upstart বিভিন্ন পরামিতি সহ একই পরিষেবাটির একাধিক ইনস্ট্যান্স চালাতে পারে। উদাহরণস্বরূপ, eth0 এ একটি মেল সার্ভার এবং eth1-তে মেইল ​​সার্ভারের অন্য একটি উদাহরণ, প্যারামিটারটিকে আপস্টার্টে পাস করা এবং সেগুলি পৃথক পরিষেবা হিসাবে পরিচালনা করা। সিস্টেমড কি এটি করতে পারে?
LtWorf

15

আমি একই জিনিসটি করতে চেয়েছিলাম, তবে প্রতিটি আর্গুমেন্টের জন্য পৃথক ফাইল ছাড়াই। আমি দেখতে পেয়েছি যে আমি স্পেসগুলির সাথে একটি দীর্ঘ তর্কটি পাস করতে পারি এবং তারপরে আর্গুমেন্টগুলি পৃথক করতে সিস্টেমেড এনভায়রনমেন্ট ভেরিয়েবল স্পেস-বিভাজন বৈশিষ্ট্যটি ব্যবহার করতে পারি।

আমি ফাইল-নাম দিয়ে একটি পরিষেবা তৈরি করেছি argtest@.service( 'চিহ্নে' ট্রেইলটি নোট করুন যা কোনও পরিষেবা যখন আর্গুমেন্ট নেয় তখন প্রয়োজনীয় )।

[Unit]
Description=Test passing multiple arguments

[Service]
Environment="SCRIPT_ARGS=%I"
ExecStart=/tmp/test.py $SCRIPT_ARGS

আমি এই রান sudo systemctl start argtest@"arg1 arg2 arg3".serviceএবং এটি পাসের arg1, arg2এবং arg3test.py. পৃথক কম্যান্ড-লাইন আর্গুমেন্ট হিসাবে


"পেছনের অ্যাম্পারস্যান্ড নোট করুন": আমি আপনার উত্তরে কোনও অ্যাম্পারস্যান্ড পাই না and আপনি কি এই উত্তরটি পরিষ্কার হতে আপনার উত্তর সম্পাদনা করতে পারেন?
প্যাট্রিক মেভিজেক

হ্যাঁ, দুঃখিত!
নোনগন

আমি মনে করি আপনি কেবলমাত্র যখনই আমি%% ব্যবহার করেন তখন @ টি কেবলমাত্র প্রয়োজন। এটি পরিষেবার একটি উদাহরণ
টবি

সম্মত, আমি সবেমাত্র কয়েকটি ব্লগ পোস্টে ছুটেছি যা এটিকে বাদ দিয়েছে। আমি আমার জবাব স্পষ্ট করব।
নোনগন

এটি অন্য কোনও পরিষেবার মধ্যে থেকে কাজ করে বলে মনে হচ্ছে না। আমি চেষ্টা করেছিলাম Wants=argtest@"arg1 arg2".serviceএবং কেবল প্রথম যুক্তিই পাস করা হয়েছিল।
রজার ডিউক

1

সবচেয়ে সহজ আমি খুঁজে পেয়েছি:

ExecStart=/bin/bash -c "\"/path/with spaces/to/app\" arg1 arg2 arg3 \"arg with space\""

এটি সমস্ত স্ব অন্তর্ভুক্ত রাখে।

এটি বলার পরে, আমি খুঁজে পেয়েছি যে কমপক্ষে উবুন্টু 18.04 এলটিএস-এ, আমার এমনকি এটি করারও দরকার নেই, আমি এটি করতে পারি এবং এটি ঠিক কাজ করে:

ExecStart="/path/with spaces/to/app" arg1 arg2 arg3 "arg with space"

$vars এই প্যাটার্নের সাথে তর্ক হিসাবেও কাজ করুন।

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