নিঃশব্দে পটভূমিতে কাজ শুরু করুন


12

আমি জানি যে আপনি ব্যাকগ্রাউন্ডে কোনও প্রক্রিয়া শুরু করতে এটি ব্যবহার করতে পারেন, প্রক্রিয়াটি যখন পটভূমিতে রাখা হয় এবং বিজ্ঞপ্তি না পেয়ে যখন এটি করা হয়:

(কমান্ড &) &> / dev / নাল

তবে প্রক্রিয়াটি শেষ হয়ে গেলে এটি ফাঁদে যাওয়ার বিকল্পটি সরিয়ে দেয় ( trap child_done CHLD)।

আমি কিভাবে উভয় থাকতে পারে?

উত্তর:


5

টাস্ক-স্পুলার আপনাকে সাহায্য করতে পারে।

যেমন টাটকা মিট নেট :

টাস্ক স্পোলার একটি ইউনিক্স ব্যাচ সিস্টেম যেখানে কাজগুলি একের পর এক চালিত হয়। একবারে চালানোর পরিমাণের যে কোনও সময় নির্ধারণ করা যেতে পারে। প্রতিটি সিস্টেমে প্রতিটি ব্যবহারকারীর নিজস্ব কাজের সারি থাকে। কাজগুলি কোনও শেল / প্রক্রিয়া থেকে সঠিক প্রসঙ্গে (এনকুইয়ের) চালানো হয় এবং এর আউটপুট / ফলাফলগুলি সহজেই দেখা যায়। এটি খুব কার্যকর যখন আপনি জানেন যে আপনার কমান্ডগুলি প্রচুর র‌্যামের উপর নির্ভর করে, প্রচুর ডিস্ক ব্যবহার করে, প্রচুর আউটপুট দেয় বা যে কোনও কারণেই সেগুলি একই সাথে চালিত না করা ভাল, আপনি যখন রাখতে চান আপনার সম্পদ সর্বাধিক বেনিফিট জন্য ব্যস্ত। এর ইন্টারফেসটি স্ক্রিপ্টগুলিতে এটি সহজেই ব্যবহার করতে দেয়।

টাস্ক-স্পোলার পাওয়া যায় ডেবিয়ান , উবুন্টু এবং অন্যান্য ডিস্ট্রো।

এটি আপনাকে চালনার জন্য ক্রিয়াকলাপের একটি সারি রাখতে দেয় এবং কেবল আকাঙ্ক্ষায় তাদের ফলাফলগুলি অ্যাক্সেস করতে দেয়।

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

$ tsp sleep 5
0 
$ tsp sleep 5 
1
$ tsp
ID   State      Output               E-Level  Times(r/u/s)   Command [run=1/1]
2    running    /tmp/ts-out.ZWn6Le                           sleep 5
1    finished   /tmp/ts-out.Fhlcle   0        5.00/0.00/0.01 sleep 5

আপনি যদি পটভূমিতে প্রচুর কাজ পরিচালনা করেন তবে এটি অবশ্যই আপনাকে সহায়তা করবে।

আপনি সেগুলি ক্রমানুসারে চালাতে পারেন বা একটি প্রিসেট পরিমাণ স্লট। এছাড়াও আপনি কর্ম মধ্যে নির্ভরতা স্থাপন করতে পারেন (রান task1 শুধুমাত্র যদি task0 সফলভাবে সম্পূর্ণ)।


3

উভয় ক্ষেত্রে এটি কীভাবে করা যায় তা এখানে {ba,z}sh

একটি ফাংশন ব্যবহার করে ব্যবহারের মাধ্যমে zshএর monitorভেরিয়েবলের অবস্থা সংরক্ষণ এবং পুনরুদ্ধার করার প্রয়োজন হয় না setopt local_options

# Run the command given by "$@" in the background
silent_background() {
  if [[ -n $ZSH_VERSION ]]; then  # zsh:  /superuser//a/1285272/365890
    setopt local_options no_notify no_monitor
    "$@" &
  elif [[ -n $BASH_VERSION ]]; then  # bash: /programming//a/27340076/5353461
    { 2>&3 "$@"& } 3>&2 2>/dev/null
  else  # Unknownness - just background it
    "$@" &
  fi
}

এটি নিম্নলিখিত হিসাবে ব্যবহার করে:

trap 'echo child done' CHLD
silent_background sleep 1

প্রত্যাশিত child doneবার্তা উত্পন্ন করবে ।


আশাবাদী, ব্যাখ্যার জন্য unix.stackexchange.com/q/456549/4778 দেখুন ।
ctrl-alt-delor

2

কমান্ড আউটপুটটির পুনঃনির্দেশটি অপ্রাসঙ্গিক বলে মনে হচ্ছে কারণ কোনও কাজ অবিচ্ছিন্নভাবে শুরু করা হলে শেল দ্বারা বিজ্ঞপ্তি প্রেরণ করা হয় । আরও স্পষ্টভাবে, এটি কাজ নিয়ন্ত্রণ সম্পর্কিত শেল বৈশিষ্ট্য (fonctionality) ।

এখানে, "বাশ রেফারেন্স ম্যানুয়াল", অধ্যায় "জব কন্ট্রোল", বিভাগের এক থেকে একটি উদ্ধৃতি এসেছে।

শেল প্রতিটি পাইপলাইনের সাথে একটি জওবিকে যুক্ত করে। এটি বর্তমানে চালানো কাজের একটি টেবিল রাখে, যা jobsকমান্ডের সাথে তালিকাভুক্ত হতে পারে । বাশ যখন অবিচ্ছিন্নভাবে কোনও কাজ শুরু করেন, তখন এটি এমন একটি লাইন প্রিন্ট করে যা দেখে মনে হয়:

[1] 25647

ইঙ্গিত করে যে এই চাকরিটি চাকরি নম্বর 1 এবং এই কাজের সাথে যুক্ত পাইপলাইনে শেষ প্রক্রিয়ার আইডি 25647। একক পাইপলাইনে সমস্ত প্রক্রিয়া একই কাজের সদস্য। বাশ জোব বিমূর্তিটি চাকরি নিয়ন্ত্রণের ভিত্তি হিসাবে ব্যবহার করে।

নোট করুন যে একটি শেল স্ক্রিপ্ট এই বিজ্ঞপ্তিটি প্রদর্শন করে না।

$ cat test
#!/bin/bash

true & echo true
$ ./test
true

বাস্তবে

Zsh

Zsh ডকুমেন্টেশন এই বিজ্ঞপ্তিগুলি সম্পর্কে অনুরূপ ইঙ্গিত সরবরাহ করে, দেখুন man 1 zshmisc, "JOBS" বিভাগটি দেখুন । যখন চাকরি নিয়ন্ত্রণ অক্ষম থাকে তখন এই বিজ্ঞপ্তিগুলি প্রদর্শিত হয় না ।

মনিটর ( -ম , কেএসএল: -ম )

    কাজের নিয়ন্ত্রণের অনুমতি দিন। ইন্টারেক্টিভ শেলটিতে ডিফল্টরূপে সেট করুন।

zsh_prompt % setopt no_monitor
zsh_prompt % true & echo true
true
zsh_prompt %
zsh_prompt % 

সজোরে আঘাত

মনে হয় বাশ সবসময় উদাঃ প্রদর্শন করে [1] 25647। "চূড়ান্ত বিজ্ঞপ্তি" উদাহরণস্বরূপ [1]+ Done trueযখন কাজের নিয়ন্ত্রণ অক্ষম থাকে তখন প্রদর্শিত হয় না ।

bash_prompt $ true & echo true
[1] 25647
true
bash_prompt $ 
[1]+  Done                    true

কাজের নিয়ন্ত্রণ অক্ষম

bash_prompt $ set +m       # disable job control
bash_prompt $ true & echo true
[1] 25685
bash_prompt $
bash_prompt $

উপসংহার

আমি জানি না যে বিজ্ঞপ্তিগুলি আড়াল করতে চাকরি নিয়ন্ত্রণ অক্ষম করা ভাল জিনিস?

সম্পদ


1

zshকাজের বিজ্ঞপ্তি অক্ষম করতে আপনি অ-ইন্টারেক্টিভ শেল হিসাবে প্রার্থনা করতে পারেন ।

zsh -c '
   trap "echo trapped child_done" CHLD
   sleep 5 &
   #wait
   sleep 10 # simulate other running cmds
   echo script done
'

0

নিম্নলিখিত উদাহরণটি দেখুন:

trap 'echo "DONE"' 0
{ find /usr & } &> /dev/null
wait

এটা ভাল কাজ করে। প্রয়োজন নেই ( ): এটি একটি প্রয়োজনীয় সাবশেল করে তোলে। { }কমান্ড গোষ্ঠীভুক্ত হয়।


কপি করে প্রিন্ট যে [2] 49591এবং [2] + 49591 exit 1 find /usr, যখন এটি প্রিন্ট করা উচিত এই ত্ত!
টাইলো

দুঃখিত, আপনার প্রশ্ন তাই ভুল বুঝে।
গিলস কুইনট

0

এটি একটি পুরানো প্রশ্ন, তবে একটি সম্ভাব্য উত্তর (ব্যাশে, zsh দিয়ে পরীক্ষা করা হয়নি) সাব-শেলটিতে জব নিয়ন্ত্রণ ব্যবহার করা: (command & wait)

দ্রষ্টব্য: বাশ সাব-শেলের প্রারম্ভিক / শেষ পটভূমির কাজের বার্তাগুলিকে দমন করে এবং পুনঃনির্দেশের প্রয়োজন নেই।


আমি মনে করি আপনি ফাঁদ দিয়ে অংশটি মিস করেছেন। যতদূর আমি প্রশ্নটি বুঝতে পারি সাব-প্রসেসটি শুরু করা উচিত, সাপ্রোসেস এক্সিকিউট করার সময় কিছু করা হবে এবং তারপরে সাবপ্রসেসটি শেষ হয়ে গেলে অন্য কিছু কার্যকর করা উচিত। আপনার সমাধানের সাহায্যে আপনি সাব-প্রসেসটি শুরু করে সাবসিতে এটির জন্য অপেক্ষা করুন এবং মূল শেলটি সাব-শেলের জন্য অপেক্ষা করে। এটি বার্তাগুলি থেকে মুক্তি পেয়েছে তবে আপনি সমান্তরালে কিছু করতে পারবেন না।
রাফেল অ্যারেনস

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