সমস্ত পটভূমি কাজ হত্যা


63

ব্যাকগ্রাউন্ড জবসকে হত্যার আরও কমপ্যাক্ট ফর্ম রয়েছে:

for i in {1..5}; do kill %$i; done

এছাড়াও, {1..5 এর স্পষ্টতই একটি হার্ড-কোডড যাদু নম্বর রয়েছে, আমি কীভাবে এটি না করে N কে সঠিক নম্বর বলে "এন" করব?

$(jobs | wc -l)

পরিচালিত চাকরির জন্য # আমি পিএস 1 এ আসলে use j ব্যবহার করি, এটি কি সমান?


3
kill $(jobs -p)সহজ বলে মনে হচ্ছে
jw013

আমি যদি সম্ভব হয় তবে আলাদা আলাদাভাবে চাকরি মেরে ফেলতে চাই। (যদিও আপনার মন্তব্যটি আমি ভুল
বুঝেছি

for pid in $(jobs -p); do kill $pid; done?
jw013

3
@ jw013 এটি কেবল সহজ নয়, এটি প্রকৃতপক্ষে সঠিক (দয়া করে এটি উত্তর হিসাবে পোস্ট করুন), আউটপুটটির লাইন গণনার উপর ভিত্তি করে এমন একটি সমাধানের বিপরীতে jobsযা কেবলমাত্র যদি কাজগুলি ক্রমাগত সংখ্যাযুক্ত হয়ে থাকে তবে কাজ করে। ওহ, এবং "স্বতন্ত্রভাবে চাকরি হত্যা" অর্থহীন: killকমান্ডটিতে একাধিক পিআইডি পাস করা তাদের পৃথকভাবে পাস করার মতোই কাজ করে।
গিলস

আমি কমান্ডটি ভুলভাবে প্রবেশ করছিলাম, kill (জব-পি) শব্দগুলি মেরে ফেললাম এবং আমার কাছেও খুব সঠিক দেখাচ্ছে। গ্রহণ করতে প্রস্তুত।
রোবটিনোসিনো

উত্তর:


102

শুধু killসব পটভূমি দ্বারা পরিচালিত কাজ bash, কি

kill $(jobs -p)

মনে রাখবেন যেহেতু jobsএবং উভয়ই killঅন্তর্নির্মিত bash, সুতরাং আপনার পক্ষে খুব দীর্ঘ প্রকারের তর্ক তালিকার কোনও ত্রুটির মধ্যে দৌড়াতে হবে না ।


2
উত্তরসূরির জন্য, বাহামাত যা ভাবছেন তা হ'ল এটিকে zshকোনও প্রকার কর্তৃপক্ষ হিসাবে অযোগ্য ঘোষণা করে do
পেথ

আমার মনে হচ্ছে এটি আমার জানা উচিত, তবে এখানে '$' কীভাবে কাজ করে?
fersarr

1
@fersarr আপনি এখানে যান
jw013

@ বাহাহাত এটি আসলে কাজ করে না যেহেতু পিআইডি চাকরীটি% + বা% এর মধ্যে একটি কিনা - তার উপর নির্ভর করে 2 বা 3 ফিল্ডে থাকতে পারে। কি কাজ করে kill %${(k)^jobdirs}, যা প্রকৃতপক্ষে দীর্ঘ; আপনার যদি পিআইডিগুলির তালিকা তৈরি করতে হয় তবে আপনি আরও দীর্ঘ ব্যবহার করতে পারেন ${${jobstates#*:*:}%%=*}
গিলস

CentOS এ, আমার প্রম্পটটি আরও >
ইনপুটটির

15

সাবকম্যান্ডের xargsপরিবর্তে ব্যবহার করুন $(jobs -p), কারণ যদি jobs -pখালি থাকে তবে কমান্ড আদেশটি ব্যর্থ হবে।

jobs -p | xargs kill

1
এটি ঠিক একই প্রভাব ফেলেছে, যদিও এটি সাহায্য মুদ্রণ করে এবং কোড 123
বিড়াল

1
কমান্ডটি
ওএসএক্সে ঠিকঠাক


jobs -p | xargs -rn10 killjobs -pকোনও পিআইডি না ফিরিয়ে দিলে আরও ভাল করা যায় । নোট করুন যে -rবিকল্পটি GNU এক্সটেনশান।
নারানাসকে

উপরে উল্লিখিত হিসাবে, এটি GNU এক্সটেনশনের -rএকটি সংক্ষিপ্ত বিন্যাস যা স্টিডিনের কোনও ডেটা না থাকলে কমান্ডটি পরিচালনা না করার নির্দেশ দেয় । --no-run-if-emptyxargs
অ্যান্টনি জিওগেইগান

3

আমি তাদের হত্যা করার আগে কোনও কাজ রয়েছে কিনা তা যাচাই করতে পছন্দ করি - কিছুই না চললে স্ক্রিপ্টটি ব্যর্থ হবে না।

এটি টাইপ করাও ছোট। এটি আপনার মধ্যে নিক্ষেপ করুন .bash_profile:

function killjobs () {
    JOBS="$(jobs -p)";
    if [ -n "${JOBS}" ]; then;
        kill -KILL ${JOBS};
    fi
}

তারপরে চালান:

killjobs

চলমান যে কোনও চাকরি মেরে ফেলতে।


1

আমার বেশ কয়েকটি ব্যাকগ্রাউন্ড যৌগিক কমান্ড রয়েছে যা আমি ম্যাকোজে প্রতিটি প্রক্রিয়াতে স্বাক্ষর প্রেরণ করে কৃপণভাবে শেষ করতে চাই। অন্য কোনও সমাধান সেটির জন্য সঠিকভাবে কাজ করে নি, তাই আমি এটি নিয়ে এসেছি:

jobs -p | xargs -n1 pkill -SIGINT -g

jobs -p বর্তমান শেল দিয়ে শুরু হওয়া পটভূমি প্রক্রিয়াগুলি তালিকাভুক্ত করে।

xargs -n1 প্রতিটি কাজের জন্য একবার পিল প্রয়োগ করে।

pkill -SIGINT -g প্রক্রিয়া গ্রুপের সমস্ত প্রক্রিয়াগুলিতে SIGINT (ctrl + c এর সমান) প্রেরণ করে।


1

আমার অনুমান যে আউটপুট কী jobs -pদেয় তার উপর নির্ভর করে সমাধানটি কিছুটা আলাদা হতে পারে। আমার ক্ষেত্রে

$ jobs -p
[1]  - 96029 running    some job
[2]  + 96111 running    some other job

অতএব, নিম্নলিখিতগুলি করা ভাল নয়।

$ jobs -p | xargs kill
kill: illegal process id: [1]

অন্যদিকে, চলমান kill $(jobs -p)কাজ করে তবে অনেকগুলি ত্রুটি বার্তা জড়িত, যেহেতু নন-পিআইডি স্ট্রিংগুলিও পাস করা killহয়।

অতএব, আমার সমাধানটি grepপ্রথমে পিআইডি এবং তারপরে নীচে ব্যবহার করুন xargs:

$ jobs -p | grep -o -E '\s\d+\s' | xargs kill

1
আপনি কোন শেল ব্যবহার করছেন? কি echo $0দেখায়? কি help jobsদেখায়? চিত্রিত আউটপুটটি পসিক্স-কমপ্লায়েন্ট নয় ; যে কোনও বাস্তবায়নের উদ্দেশ্যযুক্ত আচরণের সাথে jobsএকটি -pবিকল্প থাকা উচিত ।
ওয়াইল্ডকার্ড

1
এই বিষয়টি চিহ্নিত করার জন্য ধন্যবাদ. আমি zsh ব্যবহার করছি, এবং এটিই আজব আউটপুট হওয়ার কারণ। আমি ব্যাশে স্যুইচ করেছি এবং jobs -pকেবল আউটপুট পিআইডি করেছি। আমি সবে শিখেছি যে zsh সম্পূর্ণরূপে পসিক্স-অনুগত নয়।
ফানচেন বাও

0

মনে হচ্ছে jobs -p | xargs killকাজটি করে, তবে এটি হত্যার জন্য পাইপযুক্ত কিছু অযাচিত ফলাফল দেয় produces এখানে আমি jobs -p+ বা - অক্ষর রাখার / না করে আউটপুটকে গ্রুপিং করছি

function killjobs() {
    JOBS=$(jobs -p)
    echo $JOBS | grep -v "+\|-"| awk '{print $2}' | xargs kill -9
    echo $JOBS | grep "+\|-"| awk '{print $3}' | xargs kill -9
}

এবং পরে আপনি কেবল কল করতে পারেন killjobs

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