বাশ-এ দুটি যুগপত কমান্ড সহ Ctrl-C


15

লিনাক্স মেশিনে ব্যাশে একসাথে দুটি কমান্ড চালাতে চাই। তাই আমার ./execute.shবাশ লিপিটিতে আমি রেখেছি:

command 1 & command 2
echo "done"

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


একটি পৃথক প্রশ্নে ফলোআপ প্রশ্ন করুন এবং এখানে সরান। উভয় প্রশ্নের উত্তর দেওয়া হয়েছে বা কেবল অন্তর্নিহিত প্রশ্নটি এখনই দর্শকের পক্ষে স্পষ্ট নয়।
Zelda

উত্তর:


17

যদি আপনি টাইপ করেন

command 1 & command 2

এটি সমান

command 1 &
command 2

অর্থাৎ এটি পটভূমিতে প্রথম কমান্ডটি চালাবে এবং তারপরে অগ্রভাগে দ্বিতীয় কমান্ডটি চালাবে। বিশেষত এর অর্থ, এটি আপনারecho "done" চালানো command 2শেষ হলেও মুদ্রণযোগ্য command 1

আপনি সম্ভবত চান

command 1 &
command 2 &
wait
echo "done"

এটি ব্যাকগ্রাউন্ডে উভয় কমান্ড চালাবে এবং উভয় সম্পূর্ণ হওয়ার জন্য অপেক্ষা করবে।


আপনি যদি সিটিআরএল-সি টিপেন তবে এটি কেবলমাত্র অগ্রভাগ প্রক্রিয়াতে সিগিন্ট সিগন্যাল প্রেরণ করবে, যেমন command 2 আপনার সংস্করণে বা waitআমার সংস্করণে।

আমি এই জাতীয় ফাঁদ সেট করার পরামর্শ দেব:

#!/bin/bash

trap killgroup SIGINT

killgroup(){
  echo killing...
  kill 0
}

loop(){
  echo $1
  sleep $1
  loop $1
}

loop 1 &
loop 2 &
wait

ট্র্যাপের সাহায্যে সিটিআরএল-সি দ্বারা উত্পাদিত সিগিন্ট সিগন্যালটি killgroupফাংশন দ্বারা আটকা পড়ে এবং প্রতিস্থাপন করা হয় , যা এই সমস্ত প্রক্রিয়াটিকে হত্যা করে।


আপনার উত্তর করার জন্য আপনাকে ধন্যবাদ! আমি তবে একটি ফলো-আপ প্রশ্ন আছে। আমার কাছে এখন নিম্নলিখিত স্ক্রিপ্ট রয়েছে: ট্র্যাপ কিলগ্রুপ সিগিন্ট কিলগ্রুপ () cho ইকো হত্যার ... কিল 0 00 কমান্ড 1001 কমান্ড 1 এবং কমান্ড 2 আমি ওয়েট কমান্ড বাদ দিয়েছি কারণ কমান্ড 2 শেষ হওয়ার পরে স্ক্রিপ্টটি চালিয়ে যাওয়ার অনুমতি দেওয়া হয়েছে। তবে মনে হচ্ছে যে স্ক্রিপ্টটি চালানোর সময় কমান্ড 1 ইতিমধ্যে শুরু হয়ে গেছে। আমি কি এটি ঠিক করতে পারি? ধন্যবাদ
maero21

কমান্ড 1 সরাসরি কমান্ড 001 শেষ হওয়ার পরে শুরু হয়। আপনি set -xসম্পাদিত কমান্ডগুলি মুদ্রণের জন্য আপনার স্ক্রিপ্টের শুরুতে ব্যবহার করতে পারেন ।
মিচাস 0

6

কোনও স্ক্রিপ্ট থেকে পটভূমিতে একটি কমান্ড স্থাপন করার সময়, PID স্ক্রিনে প্রদর্শিত হয় না। আপনি বিল্টিন ভেরিয়েবলটি ব্যবহার করতে পারেন $!যা শেষ প্রক্রিয়ার পিআইডি সঞ্চয় করে যাতে আপনি কমান্ড 1 এর পিআইডি ক্যাপচার করতে পারেন।

command1 &
echo $!

কমান্ড 1 এর পিআইডি প্রতিধ্বনিত হবে।

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

#!/bin/bash

onINT() {
echo "Killing command1 $command1PID too"
kill -INT "$command1PID"
exit
}

trap "onINT" SIGINT
command1 &
command1PID="$!"
comamnd2
echo Done

এখন, কমান্ড 2 চলমান থাকাকালীন হিট করার ফলে কমান্ড 1 এবং কমান্ড 2 Ctrl Cউভয়ই স্বাক্ষর প্রেরণ করা হবে।


আপনি %nএই শেলটিতে নির্দিষ্ট ব্যাকগ্রাউন্ড জবগুলি মারতে সিনট্যাক্সও ব্যবহার করতে পারেন । সাধারণত আপনি kill %1সর্বশেষ এবং একমাত্র ব্যাকগ্রাউন্ড প্রক্রিয়াটিকে হত্যা করার জন্য ইস্যু করেন। আরও পটভূমি প্রক্রিয়াগুলির সাথে, jobsতালিকাটি প্রথমে দেখতে ব্যবহার করুন ।
9000

@ 9000: হ্যাঁ তবে ওপি একটি স্ক্রিপ্টে (./execute.sh) তাদের আদেশগুলি চালাচ্ছে তাই কাজ করার জন্য চাকরি পাওয়া নিশ্চয়ই অনেক বেশি সমস্যাযুক্ত?

@ লাইন: অবশ্যই আমি একটি স্ক্রিপ্ট থেকে চলমান সম্পর্কে পয়েন্ট মিস করি।
9000

5

জিএনইউ সমান্তরালের নতুন সংস্করণগুলি আপনি যা চান তা করবে:

parallel ::: "command 1" "command 2"
echo "done"

বা যদি commandএকই থাকে:

parallel command ::: 1 2
echo done

দ্রুত পরিচয়ের জন্য ইন্ট্রো ভিডিওটি দেখুন: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

টিউটোরিয়াল (ম্যান প্যারালাল_ টিউটোরিয়াল) দিয়ে যান। আপনি এটির জন্য আপনাকে ভালবাসার সাথে আদেশ দিন।


1

Ctrl+ + Cআপনার সামনের প্রক্রিয়া, যা করার জন্য একটি SIGINT সংকেত পাঠায় command2command1পটভূমিতে চালিত হয়, সুতরাং ইনপুট স্ট্রিম দ্বারা উদ্বিগ্ন নয়।

আপনি টাইপ করার সময় command1 &, বাশ আপনাকে প্রক্রিয়াটির 'পিআইডি' দেয়, এরকম কিছু [1234]। এই প্রক্রিয়াটি হারাতে, আপনি ব্যবহার করতে পারেন kill 1234। এখন, যদি আপনার উভয়ের পিআইডি থাকে command1এবং command2(একবার দেখুন ps -ef), তবে আপনি killসেগুলি বন্ধ করতে ব্যবহার করতে পারেন :

kill pid1 pid2 pid3 ...

একটি সামান্য কৌশল হ'ল ব্যাকগ্রাউন্ডে উভয় কমান্ড চালানো হবে:

command1 & command2 &

বাশ আপনাকে দুটি পিআইডি দেবে, হত্যা করার জন্য প্রস্তুত। আরেকটি কৌশলটি command1হ'ল আপনি হত্যা করার পরে অগ্রভাগে ফিরিয়ে আনতে হবে command2:

command1 & command2
# Hit Ctrl+C : command2 terminates.

fg # Bring back command1 to foreground.
# Hit Ctrl+C again, command1 terminates.

আরও তথ্য এখানে উপলভ্য: http://linuxg.net/how-to-manage-background-and-fireground-processes/

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