একাধিক কমান্ড চালান এবং বাশ হিসাবে তাদের হত্যা


51

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

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

আমি ব্যাকগ্রাউন্ডে ( &) প্রক্রিয়াগুলি চালিয়ে এটি উপলব্ধি করতে পারি , তবে তারপরে তাদের থামানোর জন্য আমাকে অগ্রভাগে রেখে যেতে হবে। আমি তাদের মোড়ানো একটি প্রক্রিয়া চাই এবং আমি প্রক্রিয়া বন্ধ যখন এটি 'বাচ্চাদের' বন্ধ করে দেয়।


তাদের একযোগে বা একের পর এক চলতে হবে?
মিনিক্স

হ্যাঁ, প্রক্রিয়াগুলি একই সাথে চলতে হবে তবে আমার প্রতিটি থেকে আউটপুট দেখতে হবে।
ব্যবহারকারী 1876909

উত্তর:


67

একসাথে কমান্ড চালানোর জন্য আপনি &কমান্ড বিভাজকটি ব্যবহার করতে পারেন ।

~$ command1 & command2 & command3

এটি শুরু হবে command1, তারপরে পটভূমিতে এটি চালায়। একই সঙ্গে command2। তারপরে এটি শুরু হয় command3সাধারণভাবে।

সমস্ত কমান্ডের আউটপুট একসাথে তৈরি করা হবে, তবে এটি যদি আপনার কোনও সমস্যা না হয় তবে সমাধান হবে that

আপনি যদি আউটপুটটি পরে আলাদাভাবে দেখতে চান তবে আপনি প্রতিটি কমান্ডের আউটপুটটি পাইপ করতে পারেন tee, যা আপনাকে আউটপুটটি মিরর করার জন্য একটি ফাইল নির্দিষ্ট করতে দেয়।

~$ command1 | tee 1.log & command2 | tee 2.log & command3 | tee 3.log

আউটপুট সম্ভবত খুব অগোছালো হবে। এটির বিরুদ্ধে, আপনি প্রতিটি কমান্ডের আউটপুট একটি উপসর্গ ব্যবহার করে দিতে পারেন sed

~$ echo 'Output of command 1' | sed -e 's/^/[Command1] /' 
[Command1] Output of command 1

সুতরাং আমরা যদি সেগুলি সব এক সাথে রাখি তবে:

~$ command1 | tee 1.log | sed -e 's/^/[Command1] /' & command2 | tee 2.log | sed -e 's/^/[Command2] /' & command3 | tee 3.log | sed -e 's/^/[Command3] /'
[Command1] Starting command1
[Command2] Starting command2
[Command1] Finished
[Command3] Starting command3

এটি সম্ভবত আপনি যা দেখতে যাচ্ছেন এটির এটি একটি আদর্শ আদর্শ সংস্করণ। তবে আমি এখনই এটি সম্পর্কে সবচেয়ে সেরা চিন্তা করতে পারি।

আপনি যদি তাদের একবারে বন্ধ করতে চান, আপনি বিল্ড ইন ব্যবহার করতে পারেন trap

~$ trap 'kill %1; kill %2' SIGINT
~$ command1 & command2 & command3

এটি কার্যকর করা হবে command1এবং command2পটভূমিতে এবং command3অগ্রভাগে, যা আপনাকে এটি Ctrl+ সহ মেরে ফেলতে দেয় C

আপনি যখন গত প্রক্রিয়া হত্যা Ctrl+ + কমান্ড মৃত্যুদন্ড কার্যকর করা হয়, কারণ আমরা একটি INTerupt সংকেত, জিনিস টিপে প্রেরিত অভ্যর্থনা সঙ্গে তাদের ফাঁসি সংযুক্ত + + ।Ckill %1; kill %2CtrlC

তারা যথাক্রমে প্রথম এবং দ্বিতীয় পটভূমি প্রক্রিয়াটিকে (আপনার command1এবং command2) হত্যা করে । আপনার কমান্ডগুলি ব্যবহার করে শেষ করার পরে ফাঁদটি সরিয়ে ফেলতে ভুলবেন না trap - SIGINT

কমান্ডের সম্পূর্ণ দানব:

~$ trap 'kill %1; kill %2' SIGINT
~$ command1 | tee 1.log | sed -e 's/^/[Command1] /' & command2 | tee 2.log | sed -e 's/^/[Command2] /' & command3 | tee 3.log | sed -e 's/^/[Command3] /'

আপনি অবশ্যই পর্দায় একটি নজর রাখতে পারেন । এটি আপনাকে আপনার কনসোলকে যতটা পৃথক কনসোলগুলিতে চান তা বিভক্ত করতে দেয়। সুতরাং আপনি সমস্ত কমান্ড পৃথকভাবে পর্যবেক্ষণ করতে পারেন, তবে একই সাথে।


3
সব সমালোচনার অপেক্ষায় রইলাম। :)
মিনিক্স

2
ধন্যবাদ. এটি ঠিক যা চেয়েছিল তা করে (ট্র্যাপ কমান্ড)। যদিও পুনরায় ব্যবহারযোগ্যতার জন্য সমাধানটি কোনও স্ক্রিপ্টে আবৃত করতে হবে।
ব্যবহারকারী 1876909

@ user1876909 এখানে একটি কঙ্কাল রয়েছে। নির্দিষ্টকরণগুলি আপনার উপর নির্ভর করে [1]। আমি সাহায্য করতে পেরে আনন্দিত. [1] পেস্টবিন.com
মিনিক্স

3
এটি একটি চতুর সমাধান, iv নতুন কিছু শিখেছে, ব্র্যাভো +1
মাইক-এম

1
এটা চমৎকার. এই উত্তরটি থেকে আমার অনেক কিছু খনন করতে হবে এবং শিখতে হবে।
ccnokes

20

আপনি যদি একই প্রক্রিয়া গোষ্ঠীতে এগুলি (এবং কেবলমাত্র তাদের) চালানোর ব্যবস্থা করেন তবে আপনি সহজেই একযোগে বেশ কয়েকটি প্রক্রিয়া মেরে ফেলতে পারেন ।

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

কোনও প্রক্রিয়া গোষ্ঠীর প্রক্রিয়া গ্রুপ আইডি (পিজিআইডি) হ'ল গ্রুপের মূল পিতামাতার প্রক্রিয়া আইডি। একটি প্রক্রিয়া গোষ্ঠীতে সমস্ত প্রক্রিয়াটি মেরে ফেলার জন্য PGID এর নেতিবাচক killসিস্টেম কল বা কমান্ডে পাস করুন । এই পিআইডি সহ মূল প্রক্রিয়াটি মারা গেলেও পিজিআইডি বৈধ থাকে (যদিও এটি কিছুটা বিভ্রান্ত হতে পারে)।

setsid sh -c 'command1 & command2 & command3' &
pgid=$!
echo "Background tasks are running in process group $pgid, kill with kill -TERM -$pgid"

আপনি যদি অ-ইন্টারেক্টিভ শেল থেকে পটভূমিতে প্রক্রিয়াগুলি চালনা করেন তবে সেগুলি সমস্ত শেলের প্রক্রিয়া গ্রুপে থাকবে। এটি কেবল ইন্টারেক্টিভ শেলগুলিতেই ব্যাকগ্রাউন্ড প্রক্রিয়াগুলি তাদের নিজস্ব প্রক্রিয়া গোষ্ঠীতে চালিত হয়। অতএব, যদি আপনি অগ্রভাগে থাকা একটি অ-ইন্টারেক্টিভ শেল থেকে কমান্ডগুলি কাঁটাচামচ করেন তবে Ctrl+ Cএগুলি সমস্তকে মেরে ফেলবে। waitশেলটি সমস্ত কমান্ডের প্রস্থান হওয়ার অপেক্ষা করতে করতে বিল্টিনটি ব্যবহার করুন।

sh -c 'command1 & command2 & command3 & wait'
# Press Ctrl+C to kill them all

2
undeerrated উত্তর (নীচে পদ্ধতি) বুঝতে সহজ এবং মুখস্থ করা সহজ।
নিকোলাস মার্শাল

14

আমি অবাক হয়েছি এটি এখনও এখানে নেই, তবে এটি করার আমার প্রিয় উপায়টি হ'ল ব্যাকগ্রাউন্ড কমান্ড সহ সাবশেলগুলি ব্যবহার করা । ব্যবহার:

(command1 & command2 & command3)

আউটপুট উভয় থেকেই দৃশ্যমান, সমস্ত ব্যাশ কমান্ড এবং সুবিধা এখনও পাওয়া যায় এবং একটি একক Ctrl-cতাদের সমস্তকে হত্যা করে। আমি সাধারণত লাইভ-ডিবাগিং ক্লায়েন্ট ফাইল সার্ভার এবং একই সাথে একটি ব্যাকএন্ড সার্ভার শুরু করতে এটি ব্যবহার করি, তাই আমি চাইলে উভয়কেই সহজেই হত্যা করতে পারি।

এটি যেভাবে কাজ করে তা হল command1এবং command2এটি একটি নতুন সাবসেলের উদাহরণের পটভূমিতে চলছে এবং সেই উদাহরণের command3অগ্রভাগে রয়েছে এবং সাবসেলটি প্রথমে একটি Ctrl-cকীপ্রেস থেকে কিল সংকেত লাভ করে । এটি অনেকটা কী প্রক্রিয়াটির মালিক এবং কখন পটভূমি প্রোগ্রামগুলি মারা যায় সে সম্পর্কে শ্রদ্ধার সাথে বাশ স্ক্রিপ্ট চালানোর মতো।


যদি আপনি waitচূড়ান্ত কমান্ড হিসাবে যুক্ত হন (আপনার উদাহরণে কমান্ড 3), আপনি ব্যবহারকারী Ctrl-c টিপানোর পরে ক্লিন আপ কোডটি কার্যকর করতে পারেন ।
dotnetCarpenter

0

আপনি সেমিকোলন ;বা এটির &&মতো ব্যবহার করতে পারেন :

cmd1; cmd2   # Runs both the commands, even if the first one exits with a non-zero status.

cmd1 && cmd2 # Only runs the second command if the first one was successful.

এটি একই সাথে কমান্ডগুলি চালায় না।
গিলস 21 '24

-2

আপনি একটি ব্যবহার করতে পারেন pipe। এটি একই সাথে পাইপের উভয় প্রান্তে কমান্ডগুলি শুরু করবে। CTRL-Cআপনারও সমস্ত কমান্ড বন্ধ করে দিতে সক্ষম হওয়া উচিত ।

1st command | 2nd command | 3rd command

আপনি যদি একের পর এক কমান্ডগুলি চালাতে চান তবে আপনি @ সেরনেস্যাট পদ্ধতিটি ব্যবহার করতে পারেন।


এটি প্রথম কমান্ডের আউটপুট দ্বিতীয় এক (এবং এই জাতীয়) এ চলে যায়, যা প্রথম কমান্ডের আউটপুট টার্মিনালটিতে শেষ হওয়ার কথা বলে এখানে উপযুক্ত নয়।
গিলস 21 '24
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.