ব্যাকগ্রাউন্ডে লুপ চলাকালীন কোনও ব্যাশ কীভাবে থামানো যায়?


23

আমি নীচে কিছুক্ষণ লুপ শুরু করেছি:

while true; do {command}; sleep 180; done &

লক্ষ্য করুন &

আমি ভেবেছিলাম যখন আমি টার্মিনালটি মেরে ফেলব তখন লুপটি থামবে। তবে এটি এখনও চলছে। আমি টার্মিনাল অধিবেশনটি হত্যা করার পরে ঘন্টা হয়ে গেছে।

লুপ করার সময় আমি কীভাবে এটি বন্ধ করব?

উত্তর:


38

আমি শুরু করেছি

while true; do yad; sleep 60; done &

এবং এটি পরীক্ষা করার জন্য টার্মিনালটি বন্ধ করে দিয়েছি, এখন আমারও একই সমস্যা হয়েছে।

আপনি যদি ইতিমধ্যে টার্মিনালটি বন্ধ করে রেখে থাকেন তবে লুপ ইন শুরু করেছেন

আসুন চলমান প্রসেসগুলির সাথে ps fjxআমার মেশিনের শেষ লাইনগুলি পড়ার একটি সংক্ষিপ্তসার পেতে পারি

 2226 11606 11606 19337 ?           -1 S     1000   0:00  \_ /bin/bash
11606 22485 11606 19337 ?           -1 S     1000   0:00  |   \_ sleep 10
 2226  9411  9411  8383 ?           -1 S     1000   0:00  \_ /bin/bash
 9411 17674  9411  8383 ?           -1 Sl    1000   0:00      \_ yad
    1  2215  2215  2215 ?           -1 Ss    1000   0:00 /lib/systemd/systemd --user
 2215  2216  2215  2215 ?           -1 S     1000   0:00  \_ (sd-pam)

আপনি যদি এটি বন্ধ করি তবে এটির আউটপুটে পরিবর্তিত হয় তবে আপনি এটির yadএকটি সাবপ্রসেস হিসাবে দেখতে পারেন । যদি গাছের ভিউটি খুব বিভ্রান্ত হয় তবে আপনি আউটপুটটি নিম্নলিখিত 1 অনুসারে অনুসন্ধান করতে পারেন :/bin/bashyadsleep 60ps

ps fjx | grep "[y]ad"  # or respectively
ps fjx | grep "[s]leep 60"

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

2226  9411  9411  8383 ?           -1 S     1000   0:00  \_ /bin/bash
9411 17674  9411  8383 ?           -1 Sl    1000   0:00      \_ yad

এটি bashআমরা যে সাবশেলটিকে হত্যা করতে চাই এবং এটির পিআইডি আমরা সবেমাত্র খুঁজে পেয়েছি তাই এখন যা অবশিষ্ট রয়েছে তা সরল

kill 9411  # replace 9411 with the PID you found out!

এবং বিরক্তিকর সাবশেল ভাল হয়ে গেছে।

1 : grep "[y]ad"পরিবর্তে স্বরলিপিটি কেবল প্রক্রিয়াটিকে ফলাফলের তালিকায় প্রদর্শিত হতে grep yadবাধা দেয় grep


আপনার যদি টার্মিনালটি এখনও খোলা থাকে

bashভেরিয়েবল সরবরাহ করে $!, যা "সাম্প্রতিককালে ব্যাকগ্রাউন্ডে রেখে দেওয়া কাজের প্রসেস আইডিতে প্রসারিত হয়", সুতরাং নিম্নলিখিতটি ব্যাকগ্রাউন্ডের সর্বশেষ প্রক্রিয়াটিকে হত্যা করে:

kill $!

এটি যদি সর্বশেষ প্রক্রিয়া না হয় তবে কেবল jobsবিল্টিনের সাথে চলমান কাজের তালিকার একটি উদাহরণ পেতে পারেন , উদাহরণস্বরূপ আউটপুট:

[1]-  Running                 while true; do
    yad; sleep 60;
done &
[2]+  Stopped                 sleep 10

কাজের তালিকায় দুটি কাজ রয়েছে যার মধ্যে একটিকে হত্যা করার জন্য আপনি এটিকে চাকরীর নম্বর বা শর্টকাট %, %+("বর্তমান কাজ") এবং %-("পূর্ববর্তী কাজ") দিয়ে অ্যাক্সেস করতে পারবেন , যেমন আপনার পটভূমিতে চলমান লুপটি মেরে ফেলতে করতে পার

kill %1  # or
kill %-

এবং স্থগিত করা sleep 10কাজটি হত্যার জন্য :

kill %2  # or
kill %+  # or
kill %

5

আমার লক্ষ্য রাখতে হবে যে আপনি যখন টার্মিনালটি বন্ধ করেছেন যেখানে আপনি এই আদেশটি প্রবেশ করেছেন, সাব-কমান্ডটিও তার সাথে মারা গিয়েছিল। এটি পুনরুত্পাদন করার চেষ্টা করা এই আচরণটি দেখিয়েছিল।

এখন ধরে নেওয়া, আপনি সত্যিই এমন পরিস্থিতিতে আছেন যেখানে এটি ঘটেনি, আপনি যে প্রোগ্রামটিকে পটভূমিতে চালিয়ে রেখেছিলেন তা শেষ করার এক উপায়, যা &কমান্ডের শেষের দিকে ঘটেছিল :

  1. একটি নতুন শেল খুলুন এবং echo $$আপনার বর্তমান পিআইডি (প্রসেস আইডি) নোট করতে চালান , যাতে আপনি নিজের সেশনটি না খোলেন।
  2. আপনার মনে হয় যে প্রোগ্রামটি এখনও চলমান আছে তার পিআইডি সনাক্ত করুন; ps -ef | grep $SHELLকোন প্রোগ্রামগুলি শেল চালাচ্ছে তা অনুসন্ধান করতে আপনি কমান্ডটি ব্যবহার করে এটি করতে পারেন ।
  3. বাম দিক থেকে ২ য় কলামটি নোট করুন এবং উপরের আপনার ফলাফলের চেয়ে পৃথক হওয়া সংখ্যার মানটি নোট করুন echo $$; এই যে পিআইডি আপনি হত্যা করতে চান।
  4. kill -SIGTERM <pid>কমান্ডটি চালান , যেখানে <pid>আপনি পদক্ষেপ # 3 তে সনাক্ত করেছেন এমন সংখ্যার মানটি কোথায়
  5. পদক্ষেপ # 2 পুনরাবৃত্তি করে প্রোগ্রামটি আর চলছে না তা নিশ্চিত করুন

আপনি আপনার সেশন বা আপনার কম্পিউটার পুনরায় চালু করতে পারেন, তবে উপরেরগুলি আপনাকে এড়াতে অনুমতি দেবে।


2
আপনি topপ্রক্রিয়াটি টিপে k, পিআইডি প্রবেশ করে, এবং তারপরে দুবার এন্টার টিপুন দিয়ে হত্যা করতে ব্যবহার করতে পারেন ।
luk3yx

-1

&টার্মিনাল নতুন পদ্ধতির তৈরি এবং এটা ভিতরে চালানোর জন্য আপনার কোড পাওয়ার করতে হবে। সুতরাং আপনার কোডটি টার্মিনাল প্রক্রিয়া থেকে স্বাধীন হয়ে যায়। এমনকি আপনি টার্মিনালটি বন্ধ করে দিলেও আপনার কোডটি যে নতুন প্রক্রিয়াতে চলছে তা বন্ধ হবে না। সুতরাং হয় অপসারণ করুন &বা করুন ps -aux, আপনার প্রক্রিয়াটি সনাক্ত করুন এবং এটি হত্যা করুন kill (process id)


-3

অগ্রভাগের জন্য ব্যাকগ্রাউন্ড fg এর জন্য সাধারণত বিজি । আপনি যদি & চিহ্ন ব্যবহার করেন fg এটি বর্তমান চলমান প্রোগ্রামটি দেখায়। হত্যা করতে Ctrl + C টিপুন ।


3
টার্মিনালটি বিচ্ছিন্ন হয়ে গেলে bg/ ব্যবহার fgকরবে না bash। চাইল্ড প্রক্রিয়া রয়েছে ( reptyrকারণ ) ব্যবহার করে পুনরায় যোগাযোগ করতে অক্ষম হবে । bashsleep
xiota

তিনি টার্মিনালটি বন্ধ করে দিয়েছিলেন কারণ তিনি এই প্রক্রিয়াটি মেরে ফেলবেন। সুতরাং পরের বার তিনি প্রোগ্রামটি বন্ধ করতে fg ব্যবহার করবেন। সরল
কৌতূহলী

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