আপনি ব্যবহার করতে পারেন sh -c
এবং exec
কমান্ডের পিআইডি এটি চালানোর আগেই পেতে পারেন ।
শুরু করতে myCommand
, যাতে এটির চালনা শুরু হওয়ার আগে এর পিআইডি মুদ্রিত হয়, আপনি এটি ব্যবহার করতে পারেন:
sh -c 'echo $$; exec myCommand'
কিভাবে এটা কাজ করে:
এটি একটি নতুন শেল শুরু করে, সেই শেলের পিআইডি প্রিন্ট করে এবং তারপরে একই পিআইডি রয়েছে তা নিশ্চিত করে আপনার কমান্ড দিয়ে শেলটি প্রতিস্থাপন করতে exec
বিল্টিন ব্যবহার করে । আপনার শেল সঙ্গে একটি কমান্ড রান যখন builtin, আপনার শেল হয় আসলে হয়ে যে কমান্ড বদলে আরো সাধারণ আচরণ নিজেই একটি নতুন অনুলিপি, যা তার নিজস্ব পৃথক PID, এবং যা পরে কমান্ড হয়ে forking করুন।exec
অ্যাসিনক্রোনাস এক্সিকিউশন (সহ &
), চাকরি নিয়ন্ত্রণ এবং অনুসন্ধানের সাথে জড়িত বিকল্পগুলির চেয়ে এটিকে আমি অনেক সহজ বলে মনে করি ps
। এই পদ্ধতিগুলি ঠিক আছে, তবে যদি না এগুলি ব্যবহারের নির্দিষ্ট কারণ না থাকে - উদাহরণস্বরূপ, সম্ভবত কমান্ডটি ইতিমধ্যে চলছে, যার ক্ষেত্রে তার পিআইডি অনুসন্ধান করা বা চাকরি নিয়ন্ত্রণ ব্যবহার করা বুদ্ধিমান হতে পারে - আমি প্রথমে এই পদ্ধতি বিবেচনা করার পরামর্শ দিই। (এবং আমি অবশ্যই এটি অর্জনের জন্য কোনও জটিল স্ক্রিপ্ট বা অন্যান্য প্রোগ্রাম লেখার বিষয়টি বিবেচনা করব না)।
এই উত্তরের মধ্যে এই কৌশলটির একটি উদাহরণ রয়েছে।
এই কমান্ডের কিছু অংশ মাঝেমধ্যে বাদ দেওয়া যেতে পারে, তবে সাধারণত হয় না।
এমনকি আপনি যে শেলটি ব্যবহার করছেন তা বোর্ন-স্টাইল এবং exec
এই শব্দার্থকগুলির সাহায্যে বিল্টিনকে সমর্থন করলেও , সাধারণত আপনি এই উদ্দেশ্যে sh -c
একটি নতুন, পৃথক শেল প্রক্রিয়া তৈরি করতে (বা সমতুল্য) ব্যবহার এড়াতে চেষ্টা করবেন না কারণ:
- শেলটি একবার হয়ে গেলে
myCommand
, পরবর্তী কমান্ডগুলি চালানোর জন্য কোনও শেল অপেক্ষা করে না। নিজেকে প্রতিস্থাপনের পরে sh -c 'echo $$; exec myCommand; foo
চালানোর চেষ্টা করতে সক্ষম হবে না । আপনি যদি কোনও স্ক্রিপ্ট না লিখেন যা এটিকে এটির শেষ কমান্ড হিসাবে চালিত করে, আপনি কেবল শেলটি ব্যবহার করতে পারবেন না যেখানে আপনি অন্যান্য কমান্ডগুলি চালাচ্ছেন।foo
myCommand
echo $$; exec myCommand
- আপনি এটির জন্য সাবসেল ব্যবহার করতে পারবেন না ।
(echo $$; exec myCommand)
সিনট্যাক্টিকালি এর চেয়ে সুন্দর হতে পারে sh -c 'echo $$; exec myCommand'
তবে আপনি যখন $$
ভিতরে চলে যান তখন (
)
এটি প্যারেন্ট শেলের পিআইডি দেয়, সাবসেল নিজেই নয়। তবে এটি সাবসেলের পিআইডি হ'ল নতুন কমান্ডের পিআইডি। কিছু শেল সাবসেলের পিআইডি সন্ধানের জন্য তাদের নিজস্ব অ-বহনযোগ্য ব্যবস্থা সরবরাহ করে, যা আপনি এটির জন্য ব্যবহার করতে পারেন। বিশেষত, বাশ 4 এ , (echo $BASHPID; exec myCommand)
কাজ করে।
পরিশেষে, নোট করুন যে কয়েকটি শেলগুলি একটি অপ্টিমাইজেশন সম্পাদন করবে যেখানে তারা একটি কমান্ড exec
চালিয়ে যায় যেমন (যেমন, তারা প্রথমে কাঁটাচামচ ভুলে যায়) যখন জানা যায় যে শেলটি পরে কিছু করার প্রয়োজন হবে না। কিছু শেল যেকোন সময় এটি করার চেষ্টা করে এটি চালানো শেষ কমান্ড হয়, অন্যরা কেবল তখনই তা করতে পারে যখন কমান্ডের আগে বা পরে কোনও কমান্ড না থাকে এবং অন্যরা এটি কিছু করবে না। প্রভাব যদি আপনার লেখার জন্য ভুলে যাবেন না যে হয় exec
এবং মাত্র ব্যবহার sh -c 'echo $$; myCommand'
তারপর এটি হবে কখনও কখনও উপর ডান PID, দিতে কিছু সহ সিস্টেমের কিছু শাঁস। আমি কখনও এই জাতীয় আচরণের উপর নির্ভর করার বিরুদ্ধে সুপারিশ করি এবং এর পরিবর্তে সর্বদা আপনার exec
যখন প্রয়োজন তা অন্তর্ভুক্ত করুন।