প্রদত্ত পিড process প্রক্রিয়া থেকে প্রস্থান করার জন্য শুনুন $$


16

বলুন আমার হাতে একটা পিড আছে, mypid=$$

প্রদত্ত পিডের সাহায্যে সেই প্রক্রিয়াটি থেকে বেরিয়ে যাওয়ার জন্য শোনার জন্য আমি কি কিছু বাশ / সিস্টেম কমান্ড ব্যবহার করতে পারি?

যদি মাইপিড সহ কোনও প্রক্রিয়া বিদ্যমান না থাকে, আমার ধারণা কমান্ডটি কেবল ব্যর্থ হয়।


আমি সি # ব্যবহার করি না, তবে আপাতদৃষ্টিতে অবশ্যই একটি উপায় থাকতে হবে: এমএসডিএন.মিকোসফটওয়্যার /en-us/library/fb4aw7b8(v=vs.110).aspx
আলেকজান্ডার মিলস

ইউনিক্সে, শেল বা সি লাইব্রেরি ফাংশন ব্যবহার করে শিশু প্রক্রিয়াগুলির জন্য অপেক্ষা করা সাধারণ । বাচ্চাবিহীন প্রক্রিয়াটির জন্য অপেক্ষা করার মানসম্পন্ন উপায় নেই আফাইক। এটি আরও অস্পষ্ট যে সি # ফাংশনটি এটি করতে পারে কিনা (এটি "সম্পর্কিত প্রক্রিয়া" কী তার উপর নির্ভর করে)। waitwait()
কুসালানন্দ

আমি পোলিংয়ের মাধ্যমে এটি করতে পারতাম তবে তা ভয়াবহ হবে
আলেকজান্ডার মিলস

এটি আপনাকে সম্ভাব্যভাবে ভুল ফলাফলও দেবে। পিআইডি পুনঃব্যবহারের তাত্ত্বিকভাবে অর্থ হতে পারে যে প্রক্রিয়াটি আপনি অপেক্ষা করছেন ঠিক একই পিআইডি দিয়ে জীবিত আসতে পারে। লিনাক্সে (অনুক্রমিক পিআইডি সহ) এটি অসম্ভব , তবে ওপেনবিএসডি (র্যান্ডমাইজড পিআইডি বরাদ্দ) এর মতো সিস্টেমে এটি একটি সমস্যা হয়ে দাঁড়াবে।
Kusalananda

উত্তর:


21

এই উত্তর থেকে আমার যা প্রয়োজন তা পেয়েছি: https://stackoverflow.com/a/41613532/1223975

..পিড ব্যবহার করা wait <pid> কেবল তখনই কাজ করবে যদি সেই পিডটি বর্তমান প্রক্রিয়াটির শিশু প্রক্রিয়া হয়

তবে নিম্নলিখিত যে কোনও প্রক্রিয়ার জন্য কাজ করবে:

কোনও প্রক্রিয়া শেষ হওয়ার জন্য অপেক্ষা করা

লিনাক্স:

tail --pid=$pid -f /dev/null

ডারউইনের (এটিতে $pidখোলা ফাইল রয়েছে):

lsof -p $pid +r 1 &>/dev/null

সময়সীমা (সেকেন্ড) সহ

লিনাক্স:

timeout $timeout tail --pid=$pid -f /dev/null

ডারউইনের (এটিতে $pidখোলা ফাইল রয়েছে):

lsof -p $pid +r 1m%s -t | grep -qm1 $(date -v+${timeout}S +%s 2>/dev/null || echo INF)

এটি লিনাক্সের সাথে সম্পর্কিত নয়, এটি জিএনইউ লেজের বৈশিষ্ট্য। সুতরাং এটি জিএনইউ / লিনাক্সের মতো জিএনইউ লেজযুক্ত যে কোনও সিস্টেমে কাজ করবে এবং এটি নন-জিএনইউ লিনাক্স-ভিত্তিক সিস্টেমে কাজ করবে না।
স্টাফেন চেজেলাস

আমি আশঙ্কা করছি যে লেজ / লসফ এই ক্ষেত্রে পোলিং ব্যবহার করবে, ম্যাকওএসের ক্ষেত্রে অন্ততঃ অভিজ্ঞতাবাদী প্রমাণ দেওয়া হলেও এটি প্রদর্শিত হবে।
আলেকজান্ডার মিলস

lsof + r এটিকে পুনরাবৃত্তি মোডে রাখে, যাতে কমান্ডটি প্রতি সেকেন্ডে পুনরাবৃত্তি করে তাই এটি ভোটদান, জঘন্য ব্যবহার করছে
আলেকজান্ডার মিলস

3

আপনি ব্যাশ বিল্টিন ব্যবহার করতে পারেন wait:

$ sleep 10 &
[2] 28751
$ wait 28751
[2]-  Done                    sleep 10
$ help wait
wait: wait [-n] [id ...]
    Wait for job completion and return exit status.

    Waits for each process identified by an ID, which may be a process ID or a
    job specification, and reports its termination status.  If ID is not
    given, waits for all currently active child processes, and the return
    status is zero.  If ID is a a job specification, waits for all processes
    in that job's pipeline.

    If the -n option is supplied, waits for the next job to terminate and
    returns its exit status.

    Exit Status:
    Returns the status of the last ID; fails if ID is invalid or an invalid
    option is given.

এটি সিস্টেম কল ব্যবহার করে waitpid()..

$ whatis waitpid
waitpid (2)          - wait for process to change state

চমৎকার যে আমার জন্য কাজ করে, আশা করি ভোটের নীচে পোলিং ব্যবহার করবেন না, ধন্যবাদ!
আলেকজান্ডার মিলস

1
হ্যাঁ আমার ব্যবহারের ক্ষেত্রে এটি কাজ করবে না, আমি এই ত্রুটিটি পেয়েছি: bash: wait: pid 47760 is not a child of this shell... ড্রয়িং বোর্ডে ফিরে আসি লোল
আলেকজান্ডার মিলস

আমার উত্তর আছে, আমি সবেমাত্র এটি পোস্ট করেছি
আলেকজান্ডার মিলস

2
এটি কেবলমাত্র শিশু প্রক্রিয়াগুলির জন্য অপেক্ষা করবে, বর্তমান প্রক্রিয়াটির সাথে সংযুক্ত কোনও প্রক্রিয়ার জন্য নয়।
কুসালানন্দ

1

আলেকজান্ডার মিলস যে পোস্টটি পোস্ট করেছিলেন https://stackoverflow.com/a/41613532/1223975 সমাধান সম্পর্কে Timeout in Seconds Darwin, এটি ইউএনআইএক্স-এর মতো ওএসের জিএনইউ নেই এমন একটি কাজ tail। এটি নির্দিষ্ট নয় Darwinতবে ইউএনআইএক্স-এর মতো অপারেটিং সিস্টেমের বয়সের উপর নির্ভর করে প্রদত্ত কমান্ড-লাইন প্রয়োজনীয়তার চেয়ে জটিল এবং এটি ব্যর্থও হতে পারে:

lsof -p $pid +r 1m%s -t | grep -qm1 $(date -v+${timeout}S +%s 2>/dev/null || echo INF)

কমপক্ষে একটি পুরানো ইউএনআইএক্স-তে, lsofযুক্তিটি +r 1m%sব্যর্থ হয় (এমনকি কোনও সুপারভাইজারের জন্যও):

lsof: can't read kernel name list.

m%sএকটি আউটপুট ফরম্যাট স্পেসিফিকেশন হয়। একটি সহজ পোস্ট প্রসেসরের এটির প্রয়োজন হয় না। উদাহরণস্বরূপ, নিম্নলিখিত কমান্ডটি পাঁচ সেকেন্ড পর্যন্ত পিআইডি 5959 এ অপেক্ষা করে:

lsof -p 5959 +r 1 | awk '/^=/ { if (T++ >= 5) { exit 1 } }'

এই উদাহরণে, পিআইডি 5959 পাঁচ সেকেন্ড সময় পার হওয়ার আগে যদি তার নিজস্ব চুক্তি থেকে প্রস্থান হয়, ${?}হয় 0। পাঁচ সেকেন্ড পরে ${?}ফিরে না আসলে 1

এটি স্পষ্টভাবে লক্ষ করার মতোও হতে পারে যে +r 1এটি 1হচ্ছে পোল ব্যবধান (সেকেন্ডের মধ্যে), সুতরাং এটি পরিস্থিতি অনুসারে পরিবর্তন করা যেতে পারে।

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