অন্য ব্যবহারকারী হিসাবে স্ক্রিপ্ট শুরু করা হচ্ছে


12

আমি /etc/init.d/ এ একটি স্ক্রিপ্ট তৈরি করেছি যা তাদের হোম ডিরেক্টরি থেকে অন্যান্য (মূলবিহীন সুবিধাযুক্ত) ব্যবহারকারীদের থেকে বেশ কয়েকটি স্ক্রিপ্ট চালাতে হবে, যেন তারা সেগুলি শুরু করে।

আমি এই স্ক্রিপ্টগুলি এর সাথে চালু করি: sudo -b -u <username> <script_of_a_particular_user>

এবং এটি কাজ করে। তবে চলমান প্রতিটি ব্যবহারকারীর স্ক্রিপ্টের জন্য (উদাহরণস্বরূপ কিছু ওয়াচডগ) আমি সংশ্লিষ্ট প্যারেন্ট সুডো প্রক্রিয়াটি দেখতে পাচ্ছি, এখনও জীবিত এবং মূল হিসাবে চলমান। এটি সক্রিয় প্রক্রিয়া তালিকায় একটি গোলযোগ তৈরি করে।

সুতরাং আমার প্রশ্ন হ'ল আমি কীভাবে বিদ্যমান ব্যাশ স্ক্রিপ্ট থেকে অন্য একজন ব্যবহারকারী হিসাবে অন্য স্ক্রিপ্ট চালু করতে পারি (এটিকে অনাথ (একা দাঁড়িয়ে থাকি)) প্রক্রিয়া হিসাবে ছেড়ে যেতে পারি?

আরও বিশদ বিবরণ:
আমি মূলত মেশিনে অন্য ব্যবহারকারীদের তাদের স্ট্যান্ডআপ, .startUp এবং .shutDown নামক হোম ডিরেক্টরিতে প্রাপ্ত সাব-ডাইরেক্টরিগুলিতে পাওয়া এক্সিকিউটেবল ফাইলগুলি চালিয়ে সিস্টেম স্টার্ট বা সিস্টেম শাটডাউন দিয়ে স্টাফ চালানোর উপায় সরবরাহ করার চেষ্টা করছি। যেহেতু আমি অন্য কোনও উপায় খুঁজে পাইনি যে আমি আমার বাশ স্ক্রিপ্টটি লিখেছিলাম যা ঠিক এটি করে এবং আমি এটি একটি সার্ভিস স্ক্রিপ্ট হিসাবে কনফিগার করেছি (কঙ্কালের উদাহরণ অনুসরণ করে) /etc/init.d/ এ, সুতরাং যখন এটি চালানো হয় স্টার্ট আর্গুমেন্টের সাহায্যে এটি স্টার্টআপ ডিরেক্টরিগুলি থেকে শুরু করে এবং স্টপ আর্গুমেন্টের সাথে চালিত হলে এটি তাদের হিসাবে সমস্ত ব্যবহারকারীর .shutDown ডিরেক্টরি থেকে শুরু করে।

বিকল্পভাবে আমি আগ্রহী যদি আমি এই সমস্যা সমাধানের জন্য কিছু বিদ্যমান সমাধান ব্যবহার করতে পারি।

হালনাগাদ
আমি কিছুটা ঘুরে দেখলাম এবং আমি এই প্রশ্নটি পেয়েছি: /unix/22478/detach-a-daemon-using-sudo

উত্তর গৃহীত হয়েছে, ব্যবহার করার জন্য:, sudo -u user sh -c "daemon & disown %1"আমার পক্ষে কাজ করে। তবে আমি % 1 অস্বীকার না করেও চেষ্টা করেছি এবং এটি একই রকম। সুতরাং এটিই আমার প্রত্যাশার মতো কাজ করে:

sudo -u <username> bash -c "<script_of_a_particular_user> &"

আমার এখন অতিরিক্ত প্রশ্ন হ'ল এটি কেন অস্বীকার না করে কাজ করছে? আমি কি কিছু সম্ভাব্য বিশেষ ক্ষেত্রে, নির্বিশেষে, অস্বীকার কলটি ছেড়ে দেব ?

আপডেট 2

স্পষ্টতই এটিও কাজ করে:

su <username> -c "<script_of_a_particular_user> &"

এই কল এবং সুডো কলটির মধ্যে কি কোনও পার্থক্য রয়েছে? আমি জানি এটি সম্ভাব্য একটি সম্পূর্ণ ভিন্ন প্রশ্ন। তবে যেহেতু আমি এখানে উত্তরগুলি নিজেরাই খুঁজে পাচ্ছি সম্ভবত এই বিষয়ের জন্য কেউ এখানে এটি স্পষ্ট করতে পারে।

আপডেট 3
সু বা সুডো সহ এই দুটি পদ্ধতিই আমি মেশিনটি বুট করার পরে একটি নতুন স্টার্টপার প্রক্রিয়া (রুট হিসাবে চালিত একক প্রক্রিয়া) উত্পাদন করে। প্রক্রিয়া তালিকায় দৃশ্যমান:

startpar -f -- <name_of_my_init.d_script>

কেন এই প্রক্রিয়া প্রসারিত হয়? স্পষ্টতই আমি কিছু ভুল করছি যেহেতু অন্য কোনও init.d স্ক্রিপ্টটিতে এই প্রক্রিয়াটি চলছে না।

আপডেট 4
স্টার্টপারের সমস্যাটি সমাধান করা হয়েছে। আমি তার জন্য আরও একটি প্রশ্ন শুরু করেছি:
আরসি.লোকাল বা আর ডি.ডি থেকে প্রক্রিয়া শুরু করার সময় স্টার্টপ্যার প্রক্রিয়াটি ঝুলন্ত বামে

এবং অন্য প্রশ্নবিদ্ধ ব্যবহারকারীদের জন্য চালু করার পদ্ধতি নিয়ে আরও আলোচনার জন্য আরেকটি প্রশ্ন:
আরম্ভকরণ এবং শাটডাউন অটো-চালনার ক্ষমতা সহ সাধারণ ব্যবহারকারী (অ-মূল) সরবরাহ করা

উত্তর:


18

এর সঠিক উত্তরটি ছিল সঠিক "ডিমনাইজেশন" এর জন্য, স্ট্যান্ডার্ড ইনপুট, স্ট্যান্ডার্ড আউটপুট এবং স্ট্যান্ডার্ড ত্রুটি / dev / নাল (বা কিছু প্রকৃত ফাইল) এ পুনঃনির্দেশ করা দরকার:

su someuser -c "nohup some_script.sh >/dev/null 2>&1 &"

su কমান্ড - এতে বিকল্প ব্যবহারকারী পরিচয় someuser
-c - SU যুক্তি নিদিষ্ট কমান্ড চালানোর জন্য
nohup - চালান hangups করার জন্য একটি কমান্ড অনাক্রম্য। যেসব ক্ষেত্রে অভিভাবক প্রক্রিয়া শিশু প্রক্রিয়াটি শেষ করে দেয় তা রোধ করতে। শুধু ক্ষেত্রে ক্ষেত্রে এখানে যুক্ত করা হয়েছে। তবে আসলে আমার বিশেষ ক্ষেত্রে কোনও প্রভাব নেই। এটির প্রয়োজন কিনা তা পরিবেশের উপর নির্ভর করে (চেক শপ্ট )
> / dev / নাল - স্ট্যান্ডার্ড আউটপুটটিকে কিছুইতে পুনঃনির্দেশ করুন, মূলত এটি অক্ষম করুন।
2> & 1 - পুনর্চালনা মান ত্রুটি (2) মান আউটপুট (1), যা নাল থেকে আপনাকে পুনঃনির্দেশিত করা হয় আউটপুট
& - পটভূমি আলাদা, এটি স্ট্যান্ডার্ড ইনপুট পুনর্চালনা করবে / dev / নাল।

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

এটিও লক্ষণীয় যে আপনি নিজের প্রক্রিয়াটির ফাইল বর্ণনাকারীদের / dev / নালকে পুনর্নির্দেশের পরিবর্তে বন্ধ করতে পারেন উদাহরণস্বরূপ:

su someuser -c "some_script.sh 0<&- 1>&- 2>&- &"

0 <& - স্ট্যান্ডার্ড ইনপুট (0)
1> &> বন্ধ করুন স্ট্যান্ডার্ড আউটপুট (1)
2> & - স্ট্যান্ডার্ড ত্রুটি (2) আউটপুট বন্ধ করুন

দীর্ঘ ফাইল বর্ণনাকারী নম্বর নির্দিষ্ট করা হওয়ায় <> চিহ্নের দিকটি গুরুত্ব দেয় না। সুতরাং এটি সমানভাবে ভাল:

su someuser -c "some_script.sh 0>&- 1>&- 2>&- &"

অথবা

su someuser -c "some_script.sh 0<&- 1<&- 2<&- &"

তবে স্ট্যান্ডিন এবং স্টাডাউটের সংখ্যা ছাড়াই এটি লেখার জন্য একটি ছোট্ট উপায় আছে, যেখানে দিকটি গুরুত্বপূর্ণ:

su someuser -c "some_script.sh <&- >&- 2>&- &" 

যখন ফাইল বর্ণনাকারীগুলি বন্ধ হয় বা / dev / নালকে পুনঃনির্দেশিত করা হয় ( স্টার্ট-স্টপ-ডেমোন / dev / নাল পুনঃনির্দেশ করছে) প্রক্রিয়াটি ডেমন হিসাবে পটভূমিতে চালানো নিরাপদ। সুতরাং বুট সময় স্ক্রিপ্ট চালু করার সাথে সমস্যাগুলি ( স্টার্টপার ) এড়ানোর জন্য এটি প্রয়োজন ।

আমি আমার প্রাথমিক ধারণাটি থেকে সম্পূর্ণ সমাধানটি প্রয়োগ করেছি এবং এটি গিটহাবের উপর রেখেছি:
https://github.com/ivankovacevic/userspaceServices


ইভান, সু বা স-লগিন ব্যবহার করা কি ভাল? আমি সু লোকটি পড়েছি তবে আমি এই নির্দিষ্ট ক্ষেত্রে বুঝতে পারি না।
ম্যাসিমো

1
@ মাসিমো, আমার প্রতিক্রিয়া বিলম্বের জন্য দুঃখিত! এই প্রশ্নটি পরীক্ষা করে দেখুন: unix.stackexchange.com/questions/318572/… এখানে ব্যাখ্যা করার মতো আরও ভাল ম্যানুয়াল পৃষ্ঠা রয়েছে। মূলত পার্থক্যটি ওয়ার্কিং ডিরেক্টরি এবং পরিবেশের ভেরিয়েবলগুলি সেট করার ক্ষেত্রে। আমি এই জাতীয় ব্যবহারের ক্ষেত্রে বলব (অন্য ব্যবহারকারী হিসাবে কিছু করা) এটি আসলে-লগিন ব্যবহার করার জন্য পছন্দনীয় বিকল্প হতে পারে
ইভান কোভাসেভিচ

3

আপনি বিকল্পটি দিয়ে init.d এর বাইরে স্টার্ট-স্টপ-ডেমন ব্যবহার করতে পারেন --user


আমি মিঃ শার্কের জবাব নিয়ে স্টার্ট-স্টপ-ডেমন সম্পর্কে মন্তব্য করেছি এবং আমি আমার উত্তর এবং আমার প্রশ্নের একটি
আপডেটও করেছি

2

আমি এটি পুরোপুরি পরীক্ষা করে দেখিনি, তবে আমি মনে করি এটির মতো:

/sbin/start-stop-daemon --background --start --exec /home/USER/.startUp --user USER --pidfile=/home/USER/.startUp.pid --make-pidfile

শুরুতে এবং তারপরে

/sbin/start-stop-daemon --stop --user USER --pidfile=/home/USER/.startUp.pid

বন্ধ যখন।

.SutDown স্ক্রিপ্ট হ্যান্ডলিং স্টার্টআপ জিনিসটির মতো কিছু দ্বারা করা যেতে পারে, তবে আপনি নিশ্চিত হতে পারবেন না যে স্ক্রিপ্টগুলি যেভাবেই হোক বন্ধ হওয়া উচিত :-)

কৌতুকটি করা উচিত, সম্ভবত আপনার কিছু ইনপুট পুনর্নির্দেশে নিক্ষেপ করা উচিত, তবে তারপরে আপনাকে লগ ফাইলগুলি ভরাট হওয়ার বিষয়ে চিন্তা করতে হবে।


2
মূলত, এটি কাজ করবে! স্টার্ট-স্টপ-ডিমন বুট বা অন্যথায় সফলভাবে প্রক্রিয়াগুলি শুরু করতে পারে। আমি এটি পরীক্ষা করেছি। এবং এটি হ্যাঙ্গিং স্টার্টপার প্রক্রিয়া থেকে সেই সমস্যা থেকে মুক্তি পায়। তবে আপনি আপনার প্রারম্ভিক কলে একটি --chuid ব্যবহারকারীর অভাব বোধ করছেন। এটি ছাড়া, এটি প্রক্রিয়াটিকে মূল হিসাবে চালু করবে। পিড ফাইলটি সম্ভবত সম্ভবত / var / run / এ লিখতে হবে কারণ অন্যথায় এটি ব্যবহারকারীদের হোম ডিরেক্টরিতে একটি মূল মালিকানাধীন ফাইল উত্পন্ন করে। তবে, আমার মনে, জেনেরিক স্ক্রিপ্টের জন্য স্টার্ট-স্টপ-ডেমন চালু করার বিষয়টি কিছুটা ওভারকিল বলে মনে হচ্ছে। আমি কেন উত্তর দেওয়ার চেষ্টা করলাম আমার উত্তরটি পরীক্ষা করুন।
ইভান কোভাসেভিক 21

1

আপনি ব্যবহার চেষ্টা করেছেন su?

su -c /home/user/.startUp/executable - user

-c কমান্ডটি কার্যকর করতে su কে বলে, এবং শেষ পরামিতিটি এটি হিসাবে চালানো ব্যবহারকারী।


হ্যাঁ, এটি কাজ করে তবে কিছু উদ্ধৃতি এবং অ্যাম্পারস্যান্ড যুক্ত। এবং আমি এটির মতো এটি লেখার ক্ষেত্রে আরও ক্লিনার পেয়েছি: su <username> -c "/some/path/script.sh &" "মূলত আমি সুডো ব্যবহার করেছি যেহেতু এটি পরিষ্কারকর বলে মনে হয়েছিল তবে এখন এটি ব্যবহার করা আরও ভাল বলে মনে হচ্ছে: sudo - u <username> bash -c "/some/path/script.sh &"। এই দুজনের মধ্যে কোনও পার্থক্য রয়েছে কিনা তা জানেন না
ইভান কোভাসেভিক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.