অসীম লুপটি সমাপ্তি


52

আমার একটি কমান্ড রয়েছে যা প্রতিবার এটি শেষ হয়ে গেলে আমি স্বয়ংক্রিয়ভাবে আবার চালাতে চাই, তাই আমি এরকম কিছু চালিয়েছি:

while [ 1 ]; do COMMAND; done;

তবে আমি যদি লুপটি থামাতে না পারি তবে Ctrl-cএটি কেবল লুপকে হত্যা করে COMMANDনা পুরো লুপটিকে।

টার্মিনালটি বন্ধ না করেই আমি কীভাবে অনুরূপ কিছু অর্জন করব যা আমি থামাতে পারি?


11
আমি যদি ব্যাশে থাকি তবে আমি কাজ বন্ধ করতে কেবল Ctrl-Z ব্যবহার করি এবং তারপরে এটি "মেরে ফেলুন% 1"।
পল কেগার

3
শুধু অপেক্ষা করুন ... লিনাসকে উদ্ধৃত করে বলা হয়েছিল: "আমরা সকলেই জানি লিনাক্স দুর্দান্ত ... এটি 5 সেকেন্ডের মধ্যে অসীম লুপ করে।" - তাই সত্যই ... আরও কয়েক সেকেন্ড অপেক্ষা করুন, এটি সম্পূর্ণ হওয়া উচিত।
লার্নিক্স

@ পলকিজার আমার পক্ষেও কাজ করেছেন! যেখানে Ctrl-C কাজ করে না কেন এটি কাজ করে?
সিওরো সান্তিলি :19 改造 中心 法轮功 六四 事件

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

উত্তর:


37

কমান্ডের প্রস্থান স্থিতি পরীক্ষা করুন। কমান্ডটি যদি কোনও সিগন্যালের মাধ্যমে বন্ধ হয়ে যায় তবে প্রস্থান কোডটি হবে 128 + সিগন্যাল নম্বর। বাশের জন্য জিএনইউ অনলাইন ডকুমেন্টেশন থেকে :

শেলের উদ্দেশ্যগুলির জন্য, একটি কমান্ড যা শূন্য প্রস্থান স্থিতির সাথে প্রস্থান করে সফল হয়েছে। একটি শূন্য-বহির্গমন স্থিতি ব্যর্থতা নির্দেশ করে। এই আপাতদৃষ্টিতে পাল্টা স্বজ্ঞাত স্কিমটি ব্যবহার করা হয় তাই সাফল্যকে ইঙ্গিত করার জন্য একটি সুসংজ্ঞাত উপায় এবং বিভিন্ন ব্যর্থতা মোডগুলি নির্দেশ করার বিভিন্ন উপায় রয়েছে। যখন কোনও কমান্ড মারাত্মক সিগন্যালের সমাপ্তি হয় যার সংখ্যা N, তখন বাশ 128 + N মানটি প্রস্থান স্থিতি হিসাবে ব্যবহার করে।

পসিক্স আরও উল্লেখ করে যে সিগন্যাল দ্বারা সমাপ্ত হওয়া একটি কমান্ডের মান 128 এর চেয়ে বেশি, তবে এটি GNU এর মতো সঠিক মান নির্দিষ্ট করে বলে মনে হয় না:

কমান্ডের প্রস্থান স্থিতি যা সমাপ্ত হয়েছিল কারণ এটি একটি সংকেত পেয়েছে 128 এর চেয়ে বেশি হিসাবে রিপোর্ট করা হবে।

উদাহরণস্বরূপ, আপনি যদি কন্ট্রোল-সি দিয়ে একটি কমান্ড বাধা দেন তবে প্রস্থান কোডটি হবে 130, কারণ সাইন ইন ইউনিক্স সিস্টেমে সিগন্যাল 2। তাই:

while [ 1 ]; do COMMAND; test $? -gt 128 && break; done

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

1
@ কাইল জোন্স: আপনি কি পসিক্স / জিএনইউ ডক্সের সাথে লিঙ্ক করতে পারবেন যা উল্লেখ করেছে?
সিরো সান্তিলি :0 改造 中心 法轮功 六四 事件

@ সিরোসন্টিলি হয়ে গেছে
কাইল জোন্স

কাইলজোনসকে ধন্যবাদ! এখনও অনুশীলনে COMMAND = এর জন্য কাজ করছেন না paplay alert.ogg, সম্ভবত paplayসিগন্যালটি হ্যান্ডেল করার কারণে ?
সিরো সান্তিলি 新疆 改造 中心 法轮功 六四 事件

@ সিরোসন্টিলি হ্যাঁ, এটি কারণ। যদি কোনও প্রক্রিয়া সংকেতটি পরিচালনা করে এবং প্রস্থান করে, তবে একটি অপরিবর্তিত সিগন্যাল দ্বারা প্রক্রিয়াটি সমাপ্ত হওয়ার চেয়ে আলাদা।
কাইল জোন্স

48

আপনার কাজটি ctrl+ ব্যবহার করে চলাকালীন পটভূমিতে থামিয়ে রাখতে পারেন z। তারপরে আপনি আপনার কাজটি এটির সাথে হত্যা করতে পারেন:

$ kill %1

[1] যেখানে আপনার কাজের নম্বর।


ব্যাখ্যা এবং আরও অনেক কিছুর জন্য এই উত্তরটি দেখুন।
স্কিপি লে গ্র্যান্ড গৌরু

2
এই তুলনামূলক সাম্প্রতিক উত্তরটি কেবল সহজভাবে কাজ করে। উর্ধ্বে নেওয়া দরকার। +1
23'15 এ শিবামস

আপনি আমাকে অনেক সাহায্য করেছেন। এই প্রশ্নটিতে আমি এটি অনুসন্ধান করেছি :)
ম্যাক্সিমিলিয়ান রুটা

18

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

cleanup ()
{
kill -s SIGTERM $!
exit 0
}

trap cleanup SIGINT SIGTERM

while [ 1 ]
do
    sleep 60 &
    wait $!
done

4
খুশী হলাম। অটোস্টার্টিং নেটক্যাট মোড়ক তৈরি করতে আমি এই টিপটি কীভাবে ব্যবহার করেছি তা এখানে:trap "exit 0" SIGINT SIGTERM; while true; do netcat -l -p 3000; done
ডগলাস

2
যদি আপনি trapহত্যা করার জন্য অসীম লুপের সাথে একই (বাশ) লিপিটিতে এই পন্থা যুক্ত করেন তবে ( এখানে দেখুন ) এর $$পরিবর্তে ব্যবহার করুন$!
আর্দনিউ

15

আমি সাধারণত ঠিক ধরে রাখি Ctrl-C। যত তাড়াতাড়ি বা পরে এটি COMMANDএর মধ্যে নিবন্ধভুক্ত হবে এবং এইভাবে whileলুপটি শেষ করবে । আরও ভাল উপায় আছে।


1
নিশ্চিত নয় কেন, তবে এটি paplay1 এস ফাইলের মতো নির্দিষ্ট কম্যান্ডের জন্য ব্যর্থ ।
সিরো সান্তিলি :0 改造 中心 法轮功 六四 事件

এটি আমার জন্য কাজ করেছে
আলেকজান্দার

এটি এখানে সমস্ত সমাধানের বর্বর শক্তি। : /
মার্কক্রক্সর


7

কেন সহজভাবে না,

while [ 1 ]; do COMMAND || break; done;

বা যখন কোনও স্ক্রিপ্টে ব্যবহৃত হয়,

#!/bin/bash
while [ 1 ]; do
  # ctrl+c terminates COMMAND and exits the while loop
  # (assuming COMMAND responds to ctrl+c)
  COMMAND || break
done;

1
খুব মার্জিত সমাধান। তবে কি কেবল এটিই কাজ করবে না যদি কম্যান্ড সর্বদা সাফল্যের প্রস্থান স্থিতি ফিরে আসে?
হাওয়ার্ড

হ্যাঁ, হোয়ার্ড, এটি সঠিক।
ডেল অ্যান্ডারসন 17

3

আমি অন্য একটি সমাধান পছন্দ করি:

touch .runcmd; while [ -f ".runcmd" ]; do COMMAND; sleep 1; done

লুপটি মারার জন্য, কেবল করুন:

rm .runcmd && kill `pidof COMMAND`

2
  1. আপনি সর্বদা কোনও প্রক্রিয়াটির পিআইডি ব্যবহার করে হত্যা করতে পারেন, আপনার টার্মিনালটি বন্ধ করার দরকার নেই
  2. আপনি যদি ডেমনের মতো অসীম লুপে কিছু চালাতে চান তবে আপনি সেরা পটভূমিতে রেখে দিতে পারেন
  3. while : একটি অসীম লুপ তৈরি করবে এবং আপনাকে লেখার সংরক্ষণ করবে [ 1 ]

    while :; do COMMAND; done &

এটি পিআইডি প্রিন্ট করবে। আপনি যদি প্রম্পটটি ব্যবহার করে প্রস্থান করে থাকেন ctrl+dতবে ব্যাকগ্রাউন্ড কাজটি ছাড়বে না এবং আপনি পরে যেকোন জায়গা থেকেও কাজটি মেরে ফেলতে পারেনkill PID

আপনি যদি আপনার পিআইডি ট্র্যাক হারিয়ে ফেলেন তবে আপনি এটি ব্যবহার করতে pstree -pa $USERবা pgrep -fl '.*PROCESS.*'এটি খুঁজে পেতে সহায়তা করতে পারেন


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