5 মিনিটের জন্য কোনও কমান্ড চালানোর সহজ উপায় কী? [প্রতিলিপি]


66

এই প্রশ্নের ইতিমধ্যে এখানে একটি উত্তর আছে:

কোনও নির্দিষ্ট কমান্ড (কেবলমাত্র টার্মিনেবল Ctrl-C)) মিনিটের জন্য স্বয়ংক্রিয়ভাবে চালিত হওয়ার কী সহজ উপায় আছে ?

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

minute-command 5-minutes ping www.google.com

বা অন্য কোনও কমান্ড যা নিজেকে শেষ করে না।

আমি একটি সময় সীমা নির্দিষ্ট করতে সক্ষম হতে চাই, কেবল 5 মিনিট নয়।

উত্তর:


67

(কমপক্ষে) দুটি প্রোগ্রাম রয়েছে যা এই কার্যকারিতা সরবরাহ করে:

NAME এর

timelimit - কার্যকরভাবে কোনও প্রক্রিয়ার নিখুঁত প্রয়োগের সময় সীমাবদ্ধ করুন

সংক্ষিপ্তসার

timelimit [-pq] [-S killsig] [-s warnsig] [-T killtime] [-t warntime] command [arguments ...]

এবং

NAME এর

timeout - একটি সময় সীমা সহ একটি কমান্ড চালান

সংক্ষিপ্তসার

timeout [OPTION] DURATION COMMAND [ARG]...
timeout [OPTION]

সেগুলি নিম্নলিখিতভাবে প্যাকেজ করা হয়েছে:

$ dlocate `which timeout timelimit`
timelimit: /usr/bin/timelimit
coreutils: /usr/bin/timeout

তুলনা:

/-----------------------------+------------+----------------\
|            Feature          |  timelimit |     timeout    |
+=============================+============+================+
|   time to run               | -t time    | first argument |
+-----------------------------+------------+----------------+
|   terminate signal          | -s signal  | -s signal      |
+-----------------------------+------------+----------------+
|   grace period              | -T time    | -k time        |
+-----------------------------+------------+----------------+
|   kill signal               | -S signal  | (note 1)       |
+-----------------------------+------------+----------------+
|   propagate signals         | -p         | (note 2)       |
\-----------------------------+------------+----------------/

নোট:

  1. timeoutসর্বদা SIGKILLএটি সর্বশেষ-রিসর্ট সিগন্যাল হিসাবে ব্যবহার করে ।
  2. timeout শিশু প্রোগ্রামটি এমনটি করলে সংকেত নিয়ে বেরিয়ে যাওয়ার কোনও কার্যকারিতা নেই।

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

যেমনটি timeoutডিফল্টরূপে আরও সিস্টেমে ইনস্টল করা আছে ( coreutilsবহু বিতরণের একটি মানক প্যাকেজ), আপনার প্রস্তাবিত অতিরিক্ত কার্যকারিতা প্রয়োজন না হলে আপনি এটি ব্যবহার করার পরামর্শ দিই timelimit


10
কেন আপনি অন্যটির চেয়ে একটি ব্যবহার করবেন?
ব্রাইস এম ডেম্পসে

2
@ ব্রাইসএম.ডেম্পসি আমার স্থানীয় মেশিনে, সময়সীমা উপস্থিত রয়েছে, তবে সময়সীমা নেই (যদিও এটি রেপো থেকে পাওয়া যায়)। সুতরাং, যদি তাদের মধ্যে একটি প্রাক-ইনস্টল হয় ... সেগুলি ছাড়াও, কেবল পদ্ধতি স্বাক্ষরগুলির দিকে তাকালে আমি দেখতে পাচ্ছি যে তারা বিভিন্ন কাজ করে, এবং তাদের ব্যবহারের ক্ষেত্রে বিভিন্ন ঘটনা রয়েছে।
বেনুবার্ড

নোট করুন যে এর কমপক্ষে দুটি বাস্তবায়ন রয়েছে timelimit। দেখুন আমি একটি প্রক্রিয়া হত্যা নিশ্চিত PID, পুনঃব্যবহৃত করা হয়েছে হতে পারে কিভাবে তাদের এবং গনুহ সময়সীমার আরো তথ্যের জন্য।
sch

1
@ BriceM.Dempsey timeoutগনুহ মধ্যে অন্তর্ভুক্ত করা হয় coreutils , timelimitনয়। আপনি একটি বা উভয়ই ইনস্টল করতে পারবেন না। দ্বিতীয়টির জন্য এটি টাইমলিমিট একটি কমান্ড কার্যকর করে এবং প্রদত্ত সিগন্যাল সহ একটি নির্দিষ্ট সময়ের পরে তৈরি প্রসেসটি বন্ধ করে দেয় বলে জানা গেছে প্রথমে একটি "সতর্কতা" সিগন্যাল প্রেরণ করা হয় , তারপরে, একটি টাইমআউট পরে, "কিল" সিগন্যাল, যেভাবে ইনড (8) শাটডাউনে পরিচালনা করে। এমনকি মাঝারি আচরণেও আলাদা ।
হাস্তুর

যেহেতু প্রতিটি জিএনইউ / লিনাক্সে জিএনইউ কোর্টিলগুলি পূর্বেই ইনস্টল করা আছে, timeoutতাই সেখানে যাওয়ার উপায়।
রেক্সকোগিটান

87

আসলে, এটি যা timeoutএর জন্য:

TIMEOUT(1)                          User Commands                         TIMEOUT(1)

NAME
       timeout - run a command with a time limit

SYNOPSIS
       timeout [OPTION] DURATION COMMAND [ARG]...
       timeout [OPTION]

DESCRIPTION
       Start COMMAND, and kill it if still running after DURATION.

lx@lxtp:~$ dpkg -S /usr/bin/timeout
coreutils: /usr/bin/timeout

16

বিশুদ্ধ bashসালে নির্মিত ছাড়া coreutils

আমি দেখতে পেয়েছি যে এই সমাধানটি কোনও বহিরাগত এক্সিকিউটেবলকে কল না করে বিল্ট-ইন কমান্ডের bashউপর নির্ভর করতে কাজ করে । এটি এমন সিস্টেমে কাজ করে যেখানে শেষ পর্যন্ত এমনকি কোরিউটিলগুলি ইনস্টল করা হয় না [ 1 ]

YourCommand & read -t 300 ;  kill $!                           # 1st version
YourCommand & read -t 300 || kill $!                           # 2nd version 

ব্যাখ্যা : যথারীতি যখন আপনি একটি কমান্ড মাধ্যমে ব্যাকগ্রাউন্ডে পাঠাতে &, তার PID, অভ্যন্তরীণ পরিবর্তনশীল মধ্যে সংরক্ষিত হয় $!(এর আধুনিক সংস্করণ উপস্থিত dash, csh, bash, tcsh, zsh...)।
শাঁসের মধ্যে সত্যই কী পার্থক্য তৈরি করে তা হ'ল বিল্ট-ইন কমান্ড read[ 2 ] এবং বিকল্পের উপস্থিতি -t। 1 ম সংস্করণে যদি ব্যবহারকারী নির্দিষ্ট পরিমাণ সেকেন্ডের আগে ইনপুট একটি লাইন সম্পূর্ণ না করে নির্দেশটি শেষ হবে এবং ত্রুটি রিটার্ন কোড উত্পন্ন হবে।

- TIMEOUT সময়সীমা পড়ার কারণ এবং ব্যর্থতা ফিরে আসার কারণ যদি TIMEOUT সেকেন্ডের মধ্যে সম্পূর্ণ লাইন ইনপুটটি না পড়ে থাকে।

দ্বিতীয় সংস্করণ 1 ম হিসাবে কাজ করে তবে আপনি কেবল টিপে হত্যার সময়সীমা বাতিল করতে পারেন enter
প্রকৃতপক্ষে অপারেটর বিবৃতিটি কেবল তখনই ||সম্পাদন করে killযদি readকমান্ডটি শূন্য থেকে আলাদা কোনও রিটার্ন কোড সহ প্রস্থান করে, সময়সীমার মেয়াদ শেষ হওয়ার সাথে সাথে। আপনি যদি enterএই মুহুর্তের আগে টিপেন, এটি 0 ফিরে আসবে এবং এটি আপনার পূর্ববর্তী আদেশটি হত্যা করবে না।


কোরিটিলস দ্রবণগুলি [ 1 ]

যখন কোরিউটিলগুলি আপনার সিস্টেমে উপস্থিত থাকে এবং আপনার কোনও বাহ্যিক প্রোগ্রাম কল করার জন্য সময় এবং সংস্থানগুলি সাশ্রয় করার প্রয়োজন হয় না timeoutএবং sleepএবং আপনার লক্ষ্যে পৌঁছানোর উভয়ই সঠিক উপায়।

timeoutএর ব্যবহার timeoutসোজা।
অবশেষে আপনি -kযদি প্রথম ব্যর্থ হন তবে অতিরিক্ত কিল সংকেত প্রেরণের বিকল্পটিও বিবেচনা করতে পারেন ।

timeout 5m YourCommand                                         # 3rd version 

sleep সঙ্গে sleepআপনি আপনার কল্পনা ব্যবহার করুন অথবা কিছু অনুপ্রেরণা নিতে পারেন [ 3 ] । নোট করুন যে আপনি আপনার কমান্ডটি পটভূমিতে বা অগ্রভাগে রেখে যেতে পারেন (উদাহরণস্বরূপ topসাধারণত অগ্রভাগে থাকা প্রয়োজন)।

YourCommand & sleep 5m; kill $!                                # 4th Background
YourCommand & pid=$! ; (sleep 5m; kill $pid;) &                # 5th Background

bash -c '(sleep 5m; kill $$) & exec YourCommand'               # 6th Foreground
(cmdpid=$BASHPID; (sleep 5m; kill $cmdpid) & exec YourCommand) # 7th Foreground

ব্যাখ্যা

  • চতুর্থ সংস্করণে আপনি ব্যাকগ্রাউন্ডে চালিত করেন YourCommandতারপরে আপনার শেলটি sleep5 মিনিটের জন্য। এটি শেষ হয়ে গেলে শেষ পটভূমি প্রক্রিয়াটি ( $!) নিহত হবে। আপনি আপনার খোল থামান।
  • পরিবর্তে 5 তম সংস্করণে আপনি ব্যাকগ্রাউন্ডে চালিত করেন YourCommandএবং আপনি তত্ক্ষণাত সেই পিআইডিটি ভেরিয়েবলে সঞ্চয় করেন $pid। তারপরে আপনি ব্যাকগ্রাউন্ডে 5 মিনিটের জন্য একটি ন্যাপ এবং তার ফলস্বরূপ কমান্ড কার্যকর করেন যা এই সঞ্চিত পিআইডিকে হত্যা করবে। যেহেতু আপনি পটভূমিতে এই গোষ্ঠীটির আদেশগুলি পাঠিয়েছেন আপনি নিজের শেলটি থামান না। আপনাকে একটি ভেরিয়েবলে পিআইডি সংরক্ষণ $!করতে হবে কারণ এর মানটি ব্যাকগ্রাউন্ডে অন্য কোনও প্রোগ্রামের পরিণামে আপডেট করা যেতে পারে। সহজ কথায় আপনি ভুল প্রক্রিয়া বা কোনও প্রক্রিয়া মোটেই ঝুঁকি এড়াতে পারবেন ।
  • । ষ্ঠ সংস্করণে এটি একটি নতুন বাশ শেল নামে পরিচিত যা minutes মিনিটের মধ্যে নিজেই আত্মহত্যা করবে $$, তারপরে এটি আপনার আদেশটি কার্যকর করা হবে যা পূর্বের অংশে থেকে যায়।
  • 7th ম সংস্করণে এটি এমন একটি সাবশেল আহ্বান করা হয়েছে ()যা তার পিআইডি একটি ভেরিয়েবল ( cmdpid) এ সঞ্চয় করে এবং ব্যাকগ্রাউন্ড এক্সিকিউশনে প্রেরিত অন্য সাবশেলের সাহায্যে নিজেকে মেরে ফেলে, তারপরে আপনার কম্যান্ডটি অগ্রভাগে চালায়।

অবশ্যই প্রত্যেকটি সংস্করণ আপনি হত্যার সংকেত আপনি প্রয়োজন পাঠাতে পারেন ডিফল্ট এক থেকে চরম kill -9 , শুধুমাত্র ব্যবহার করা হবে যখন সত্যিই প্রয়োজন ছিল।

তথ্যসূত্র

  • [ 1 ] কোরিটিলস
  • [ 2 ] বাশ শুরুর গাইড
  • [ 3 ] বাশফাক্স

2
"ঘুমের সাথে আপনি আপনার কল্পনা ব্যবহার করতে পারেন বা কিছু অনুপ্রেরণা নিতে পারেন [বাশ এফএকিউ এর লিঙ্ক]" +1 #thatsenoughinternetfortoday
জোয়েটউইডল

11

আপনার নির্দিষ্ট ক্ষেত্রে, বেশিরভাগ pingসমর্থন বাস্তবায়ন -cবা --countনির্দিষ্ট সংখ্যক পিংসের পরে সমাপ্তি:

ping -c 300 host.example.com

আরও সাধারণ সমাধানের জন্য, অন্যান্য উত্তরগুলি দেখুন।


7
আমি pingএকটি দৃ concrete় উদাহরণের জন্য সরবরাহ করা ছাপ ওপিকে পেয়েছি । তিনি প্রতিটি ভিন্ন প্রোগ্রামের জন্য কেস-কেস সমাধান সমাধান করতে চান না।
ব্যবহারকারী 1717828

8

আপনি এটির মতো সাধারণ স্ক্রিপ্ট দিয়ে এটি করতে পারেন:

#!/bin/bash

#
# $1 is the time to let the program run, and $2, $3, ... are the command itself.
#

"${@:2}" &
PID=$!
sleep "${@:1:1}"
kill -2 $PID

(নীচের মন্তব্যে মাটিজা নালিসের পরামর্শ অনুসারে সিগন্যাল সিগিন্ট = 2 ব্যবহার করা হয়েছে)।

(অস্বাভাবিক?) বাশ অভিব্যক্তিটির ব্যাখ্যা $@:...: অবস্থানগত পরামিতি, ( $*, $@, "$*", "$@") নিম্নলিখিত অতিরিক্ত স্পেসিফিকেশন স্বীকার করুন, উদাহরণস্বরূপ:

"${@:START:COUNT}"

যার অর্থ: সমস্ত প্যারামিটারগুলির মধ্যে, এর মধ্যে COUNT টি নিন, প্রথম যেটি নেওয়া হবে এটি প্রথম অবস্থানে রয়েছে; যদি COUNT বাদ দেওয়া হয় তবে এগুলির সবগুলি শেষ অবধি শুরু করুন, START এর অবস্থান থেকে শুরু করুন। মনে রাখবেন $0এটি প্রোগ্রামের নাম। START যদি নেতিবাচক হয় তবে শেষ থেকে গণনা শুরু করুন, এবং মনে রাখবেন যে COUNT টি নেতিবাচক হতে পারে না , তাই শেষ যুক্তি "${@:-1}"। এছাড়াও, প্রায় সবসময় ডাবল কোটের ভিতরে অবস্থানগত পরামিতিগুলি অন্তর্ভুক্ত করে।


1
আমি সম্ভবত প্রথম বা শেষ আর্গ হিসাবে সময় নেওয়ার জন্য স্ক্রিপ্টটি নকশা করতাম এবং কমান্ড হিসাবে অন্যান্য সমস্ত আর্গ পরিচালনা করতাম। বাশ শব্দ বিভাজন দেওয়া $1বেশ স্থূল g এছাড়াও, আপনি ঠিক sleep "$1"বা কিছু করতে পারেন countdown
পিটার কর্ডেস

1
আপনার ইচ্ছা অনুযায়ী @ পিটারকর্ডস সম্পন্ন হয়েছে।
মারিয়াসমাতুটিয়া

প্রথম আরগের সময় আপনাকে করতে দেয় time=$1; shiftএবং তারপরে অবস্থানিক পরামিতিগুলির জন্য আপনার অ্যারে-স্লাইসিং সিনট্যাক্সের প্রয়োজন হবে না। তবে হ্যাঁ, এটি অনেক সহজ।
পিটার কর্ডস

1
@ পিটারকর্ডস রাজি হয়েছে, তবে আপনি আমাকে এটি দেখতে নিরাপদ উপায় জানেন কিনা এবং আমার সবেমাত্র অলসতা ছিল কিনা, বা আমি কেবল স্পষ্টভাবে অজ্ঞ ছিলাম কিনা তা জানতে আমাকে জিজ্ঞাসা করেছিলেন। হাঃ হাঃ হাঃ.
মারিয়াসমাতুটিয়া

যেভাবে পোস্টারটিতে বিশেষভাবে বাধা দেওয়া যেতে পারে এমন প্রোগ্রাম সম্পর্কে জিজ্ঞাসা করা হয়েছিল ctrl-c, সম্ভবত তার kill -INTপরিবর্তে চেষ্টা করা ভাল kill -9(বা -9প্রথমটি সফল না হলে কেবল কয়েক সেকেন্ড পরে চেষ্টা করুন - এটি প্রোগ্রামকে পরিষ্কারভাবে প্রস্থান করার এবং অস্থায়ী ফাইলগুলি না ছেড়ে দেওয়ার সুযোগ দেয়) ইত্যাদির আশেপাশে)
মতিজা নালিস

5

যেহেতু আপনি pingআপনার উদাহরণে উল্লেখ করেছেন; একটি নির্দিষ্ট সময়ের পরে থামার জন্য এই কমান্ডের কয়েকটি বিকল্প রয়েছে:

  • w সময়সীমা কত প্যাকেট প্রেরণ বা প্রাপ্ত তা বিবেচনা না করেই পিং ছাড়ার আগে সেকেন্ডে একটি সময়সীমা নির্দিষ্ট করে । এই ক্ষেত্রে কাউন্ট প্যাকেট প্রেরণের পরে পিং থামবে না , এটি সময়সীমা শেষ হওয়ার জন্য বা কাউন্ট প্রোবের উত্তর না পাওয়া পর্যন্ত বা নেটওয়ার্ক থেকে কিছু ত্রুটি বিজ্ঞপ্তির জন্য অপেক্ষা করে ।
  • ডাব্লু সময়সীমা সেকেন্ডে, একটি প্রতিক্রিয়া জন্য অপেক্ষা করার সময়। বিকল্পটি কোনও প্রতিক্রিয়ার অভাবে কেবল সময়সীমাকে প্রভাবিত করে, অন্যথায় পিং দুটি আরটিটি-র জন্য অপেক্ষা করে।

-man ping

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