টার্মিনালে লুপ বাশ স্ক্রিপ্ট কীভাবে বন্ধ করবেন?


54

উদাহরণ স্বরূপ,

#!/bin/bash
while :
do
    sl
done

কীভাবে এই বাশ স্ক্রিপ্টটি শেষ করবেন?


1
আরও বিশদ দিন। আপনি কি এটি ইন্টারেক্টিভ বা প্রোগ্রামগতভাবে বন্ধ করতে চান?
manatwork

1
আপনি সিগন্যালটি ctrl-cপ্রেরণ করতে টিপতে পারেন SIGINT(বেশিরভাগ শেলসে) বা আপনি টিপতে পারেন ctrl-zযা SIGTSTPসিগন্যাল প্রেরণ করে (বেশিরভাগ শেলগুলিতে)। ক্ষেত্রে আপনি চাপ দিয়েছিলেন ctrl-zযে সম্পর্কিত প্রক্রিয়াটি হত্যা করা হয়নি তবে বিরতি দেওয়া হয়েছে। আপনি এটিকে আবার চালু করতে পারেন fg(কমপক্ষে bash)
ব্যবহারকারী 1146332

না, এটি কাজ করে না!
যিনিয়ানঘু

4
সমস্যাটি স্ক্রিপ্টের নয়, তবে যে slকমান্ডটি আমি বিশ্বাস করি তা হ'ল যারা ভুল বানান করে তাদের জন্য একটি বিরক্তিকর আদেশ ls, ধীরে ধীরে একটি ট্রেন দেখিয়ে দেখায়। আমি যতদূর জানি এটি SIGINTসংকেতটিকে আটকে ফেলেছে এবং অবশ্যই এটি দিয়ে হত্যা করা হবে SIGKILL

1
ধন্যবাদ। আমার ডিসট্রোর জন্য প্যাক করা হয়নি, এজন্যই আমি এটি জানি / খুঁজে পাইনি। (আমি মনে করি আমি এটির জন্য কোনও আবেদন করব না))
manatwork

উত্তর:


64

প্রোগ্রামটি slউদ্দেশ্যমূলকভাবে উপেক্ষা করে SIGINT, যা আপনি টিপলে পাঠানো হয় Ctrl+C। সুতরাং, প্রথমত, আপনাকে যুক্তি যুক্ত করে slঅবহেলা করতে বলা উচিত ।SIGINT-e

আপনি যদি এটি চেষ্টা করেন, আপনি লক্ষ্য করবেন যে আপনি প্রতিটি ব্যক্তিকে থামাতে পারবেন sl, তবে তারা এখনও পুনরাবৃত্তি করে। পাশাপাশি bashবের হওয়ার জন্য আপনাকেও বলতে হবে SIGINTtrap "exit" INTলুপের আগে একটি রেখে আপনি এটি করতে পারেন ।

#!/bin/bash
trap "exit" INT
while :
do
    sl -e
done

5
এটি পরীক্ষা করার জন্য আমার ইনস্টল করা নেই তবে আপনি এটি সিটিএলএইচ-এর থেকে সিকুইট-এর মাধ্যমেও মেরে ফেলতে পারবেন
ডার্বার্ট

120
  1. Ctrl-Zস্ক্রিপ্ট স্থগিত করতে টিপুন
  2. kill %%

%%ব্যাশ বিল্ট-ইন বলে killযে আপনি বর্তমান শেল সম্প্রতি স্থগিত পটভূমি কাজ করার জন্য একটি সংকেত (ডিফল্ট অনুসারে SIGTERM) পাঠাতে, একটি প্রক্রিয়া-আইডি চান না।

আপনি সংখ্যা বা নাম দিয়েও কাজ নির্দিষ্ট করতে পারেন। উদাহরণস্বরূপ, আপনি যখন with Z দিয়ে কোনও কাজ স্থগিত করবেন, তখন বশ আপনাকে জানায় যে এর কাজের নম্বরটি এমন [n]+ Stoppedকিছুর সাথে কী যেখানে nবর্গাকার বন্ধনীগুলির ভিতরে কাজ নম্বর।

কাজ নিয়ন্ত্রণ ও প্রাণনাশ কাজ সম্পর্কে আরও তথ্য, চালানোর জন্য help jobs, help fg, help bg, এবং help killব্যাশ, এবং অনুসন্ধান JOB CONTROL(সমস্ত ক্যাপ) অথবা jobspecব্যাশ মানুষ পৃষ্ঠা থেকে।

যেমন

$ ./killme.sh 
./killme.sh: লাইন 4: sl: কমান্ড পাওয়া যায় নি
./killme.sh: লাইন 4: sl: কমান্ড পাওয়া যায় নি
./killme.sh: লাইন 4: sl: কমান্ড পাওয়া যায় নি
./killme.sh: লাইন 4: sl: কমান্ড পাওয়া যায় নি
./killme.sh: লাইন 4: sl: কমান্ড পাওয়া যায় নি
...
...
...
./killme.sh: লাইন 4: sl: কমান্ড পাওয়া যায় নি
^ জেড
[1] + বন্ধ ./ কিল্ম.শ
$%% হত্যা
$ 
[1] + সমাপ্ত। / কিল্ম.শ

এই উদাহরণে, কাজের নম্বর 1 ছিল, তাই kill %1একই কাজ করতে হবেkill %%

(দ্রষ্টব্য: আমি slইনস্টল করি নি তাই আউটপুটটি কেবল "কমান্ড পাওয়া যায়নি" your আপনার ক্ষেত্রে, আউটপুট এসএল যা কিছু উত্পাদন করে তা আপনি পাবেন it's এটি গুরুত্বপূর্ণ নয় - ^Zসাসপেন্ড এবং kill %%একই কাজ করবে)


3
আর একটি ভাল উত্তর!
Yinyanghu

2
বিটিডাব্লু, দ্রুত এইভাবে চালানো লুপগুলির জন্য, ^ Z C এর চেয়ে প্রক্রিয়াটি হ্রাস করার একটি আরও নির্ভরযোগ্য উপায় হতে পারে। ^ সি লুপটিতে slচালিত প্রোগ্রামে ( ) প্রেরণ করা হবে , তবে স্ক্রিপ্টটি চলতে থাকবে ... এবং অন্যটি শুরু করবে sl। আপনি যদি কয়েকবার সত্যিই দ্রুত press সি টিপে থাকেন তবে আপনি slস্ক্রিপ্ট এবং স্ক্রিপ্ট উভয়কেই মেরে ফেলতে পারেন (যদি তারা দু'জনের স্বাক্ষর আটকে নাও)। ^ জেড প্রায় সঙ্গে সঙ্গেই (অবিলম্বে যদি আপনি বাফার না গণনা না আউটপুট যে এখনও আপনার টার্মিনালে ছাপা হচ্ছে) স্ক্রিপ্ট স্থগিত হবে, তাই আপনার সাথে এটি হত্যা করতে পারেkill %%
CA গুলির

একদম ঠিক! আমাকে বলতে হবে " slএকটি মজাদার প্রোগ্রাম"। এবার আমার আবার মজা! @ _ @
ইয়িনিয়ানঝু

যখন লুপটি কোনও স্ক্রিপ্ট থেকে নয় সরাসরি কমান্ড লাইন থেকে কল করা হয় তখন কেবল সেই উত্তরটি কার্যকর হয়।
স্কিপি লে গ্র্যান্ড গৌরু

1
@ ড্রুচাপিন আমি কখন / কোথায় এটি সম্পর্কে জানতে পেরেছি তা মনে করতে পারছি না - কেবল "আমি চিরকাল থেকেই" জানি। ব্যাশ মানুষ পৃষ্ঠা (অনুসন্ধান jobspec ) বলেন:The symbols %% and %+ refer to the shell's notion of the current job, which is the last job stopped while it was in the foreground or started in the background. The previous job may be referenced using %-. If there is only a single job, %+ and %- can both be used to refer to that job
সি এ এস

6

লুপটি থামাতে আপনি যদি সিটিআরএল + সি চান তবে স্ক্রিপ্টটি সমাপ্ত || breakনা করেন আপনি যে কোনও কমান্ড চালাচ্ছেন তার পরে আপনি স্থাপন করতে পারেন । আপনি যে প্রোগ্রামটি চালাচ্ছেন এটি যতক্ষণ না সিআরটিএল + সিতে সমাপ্ত হয় ততক্ষণ এটি দুর্দান্ত কাজ করে।

#!/bin/bash
while :
do
    # ctrl+c terminates sl, but not the shell script
    sl -e || break
done

যদি আপনি নেস্টেড লুপটিতে থাকেন তবে আপনি দুটি স্তরের বাইরে যেতে "ব্রেক 2" ব্যবহার করতে পারেন ইত্যাদি etc.


বিরতি 2 এর জন্য প্লাস 1
ফ্লাইংফিংগার

3

আপনি যেখানে স্ক্রিপ্টটি শুরু করেছিলেন সেখানে টার্মিনাল থেকে Ctrl + C টিপে স্ক্রিপ্টটি শেষ করতে পারেন। অবশ্যই এই স্ক্রিপ্টটি অবশ্যই অগ্রভাগে চালানো উচিত যাতে আপনি এটি Ctrl + C দ্বারা বন্ধ করতে সক্ষম হন।

অথবা আপনি অন্য খোলার টার্মিনালে এই স্ক্রিপ্টের পিআইডি (প্রসেস আইডি) খুঁজে পেতে পারেন:

ps -ef | grep <name_of_the_script>
kill -9 <pid_of_your_running_script>

উভয় উপায়ে আপনার জন্য জিজ্ঞাসা করা কৌশলটি করা উচিত।


1
এটি টার্মিনাল থেকে Ctrl + C দ্বারা শেষ করা যাবে না। সুতরাং আমি পিএস বা শীর্ষ দ্বারা এটি হত্যা করতে হবে। আমি কেবল এটি কীভাবে হত্যা করব তা জানতে চাই!
Yinyanghu

3

সবচেয়ে সহজ উপায় হ'ল QUITসংকেত ইস্যু করা , যা সাধারণত সংযুক্ত থাকে Control-Backslash

আপনি যখন ট্রেনটি দেখেন, নিয়ন্ত্রণ- hit টিপুন


1

আপনি শেলের (ব্যাশ)। আমি শুধু চেষ্টা করেছি এবং এটি কাজ করে। কারণ আমি প্রক্রিয়াটি দেখতে পাচ্ছি না (আমরা যে লুপিং স্ক্রিপ্টটিতে কাজ করি)।killpid

ps -ef


0

সম্পূর্ণ স্ক্রিপ্টটি শেষ করার আরেকটি উপায় হ'ল slকমান্ডটির পটভূমি এবং তারপরে সিগন্যালের INTসাহায্যে স্ক্রিপ্টের পুরো প্রক্রিয়া গোষ্ঠীকে হত্যা করার জন্য ট্র্যাপ সিগন্যাল HUP

#!/bin/bash

trap 'trap - INT; kill -s HUP -- -$$' INT
#trap 'trap - INT; kill -s HUP 0' INT

while :
do
   sl & wait
done


-1
while [ true ] 
do

  #check if script is running
  ps | grep script_name.sh | grep -v grep >/dev/null 2>&1

  if [ "$!" != "0" ] ; then
    break
  else

    kill -9 ` ps -ef | grep script_name.sh | cut -d "a" -f 1` 
    echo "kill -9 `get script PID`"

  fi

done

এই সাহায্য করা উচিত।


2
আপনি কেন মনে করেন যে সর্বশেষ পটভূমি কমান্ডের পিআইডি 0 হবে?
manatwork

-1

হত্যার জিনিসটি ভয়াবহ, কারণ আপনি এখনই কখনও করেননি, যদি স্ক্রিপ্টটি দু'বার চালাতে হয়। এবং আপনার প্রস্থান কোডটি ভুল।

while [ something ]; do

 if [ somethingelse ]; then
   echo shut down script with exit code 0
   exit 0
 fi
done

echo something else not happend
exit 2 # Return val important for example for monitoring

কোন কাজ. সমাধান = পার্ল ব্যবহার করুন। নিজের বাশ খোলে

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