লিনাক্সের অধীনে স্থগিত অবস্থায় আমি কীভাবে একটি প্রক্রিয়া শুরু করব?


19

ব্যবহারিকভাবে, আমার এমন একটি প্রক্রিয়া প্রয়োজন যা আচরণ করে, যেন আমি Ctrl+Zএটি শুরু করার ঠিক পরে চাপ দিয়েছিলাম ।

আশা করি, শেল স্ক্রিপ্ট ব্যবহার করে এ জাতীয় কাজ করা সম্ভব।

(এছাড়াও, ফলাফলের পিআইডি জেনে রাখা দুর্দান্ত হবে, তাই আমি পরে প্রক্রিয়াটি চালিয়ে যেতে পারতাম))

উত্তর:


7

একটি প্রক্রিয়া শুরু করার পরে, আপনি এটি স্থগিত করার জন্য এটি সাইনস্টপ পাঠাতে পারেন। এটি পুনরায় শুরু করতে, SIGCONT প্রেরণ করুন। আমি মনে করি এই ছোট স্ক্রিপ্টটি আপনাকে সাহায্য করতে পারে

#!/bin/bash
$@ &
PID=$!
kill -STOP $PID
echo $PID
wait $PID

এটি প্রক্রিয়া চালায় (পরামিতি হিসাবে কমান্ড প্রেরণ), এটি স্থগিত করে, প্রক্রিয়া আইডি প্রিন্ট করে এবং এটি শেষ না হওয়া পর্যন্ত অপেক্ষা করুন।


1
আমি এটিকে অব্যাহত রাখার জন্য এটি পরিবর্তন করেছি: [প্রবেশ] #!/bin/bash [প্রবেশ] $@ & [প্রবেশ] PID=$! [প্রবেশ] kill -STOP $PID [প্রবেশ] echo "Suspended: $PID, press ENTER to continue it" [প্রবেশ] read [প্রবেশ] kill -CONT $PID [প্রবেশ] wait $PID [প্রবেশ]echo
জাভা.আইস.ফোর.ডেস্কটপ

7
ঠিক তাই আপনি জানেন, সাব-প্রসেসটি এটিতে স্টপ সিগন্যাল প্রেরণের সুযোগ পাওয়ার আগেই শেষ হতে পারে।
মাইকিবি

16
রেসগুলিতে আর একটি দিন।
ctrl-alt-delor

23

আপনি কোন পরিবেশ থেকে প্রক্রিয়া তৈরি করছেন?

আপনি যদি এটি কোনও সি সি কোডের মতো পরিবেশ থেকে করছেন, তবে আপনি ()) কাঁটাচামচ করতে পারেন এবং তারপরে সন্তানের মধ্যে, এক্সিকিউটিভ ()) এর আগে নিজের কাছে একটি সাইনস্টপ প্রেরণ করুন, আরও কার্যকর হওয়া আটকাতে পারেন।

আরও জেনেরিক সমাধান (সম্ভবত সেরা) হ'ল এটির মতো স্টাব তৈরি করা। সুতরাং স্টাব প্রোগ্রাম হবে:

  • আসল প্রোগ্রামের নাম এবং যুক্তি সমন্বিত যুক্তিগুলি গ্রহণ করুন
  • নিজেই একটি সাইনস্টপ প্রেরণ করুন
  • exec () যথাযথ যুক্তি সহ বাস্তব প্রোগ্রাম

এটি নিশ্চিত করবে যে নতুন প্রসেসিংয়ের সাথে সংকেত পাঠানোর আগে আপনি কোনও প্রকারের রেস শর্তকে এড়িয়ে যাচ্ছেন।


শেলের জন্য একটি উদাহরণ:

#!/bin/bash
kill -STOP $$
exec "$@"

এবং উপরের কোডজ ব্যবহার:

michael@challenger:~$ ./stopcall.sh ls -al stopcall.sh

[1]+  Stopped                 ./stopcall.sh ls -al stopcall.sh
michael@challenger:~$ jobs -l
[1]+ 23143 Stopped (signal)        ./stopcall.sh ls -al stopcall.sh
michael@challenger:~$ kill -CONT 23143; sleep 1
-rwxr-xr-x 1 michael users 36 2011-07-24 22:48 stopcall.sh
[1]+  Done                    ./stopcall.sh ls -al stopcall.sh
michael@challenger:~$ 

jobs -lPID, দেখায়। তবে আপনি যদি এটি শেল থেকে করছেন তবে আপনার সরাসরি পিআইডি লাগবে না। আপনি কেবল এটি করতে পারেন: kill -CONT %1(ধরে নিচ্ছেন আপনার কেবল একটি কাজ আছে)

একাধিক কাজ করে তা করছেন? পাঠকের জন্য অনুশীলন হিসাবে রেখে গেছে :)


আমি শেল স্ক্রিপ্ট থেকে এটি করার আশা করছিলাম ...
java.is.for.desktop

দুর্দান্ত, সুতরাং যেহেতু আপনি শেল স্ক্রিপ্ট থেকে এটি করতে চান, তাই স্টাব প্রোগ্রামটি ব্যবহার করুন।
মাইকিবি

20

মাইকিবির উত্তরটি সঠিক। সুপারভাইজারের এই প্রশ্ন থেকে এখানে আরও সংক্ষিপ্ত সংস্করণ দেওয়া হয়েছে:

( kill -SIGSTOP $BASHPID; exec my_command ) &

এটি বোঝার জন্য, আমাদের ইউনিক্সে প্রক্রিয়াগুলি কীভাবে শুরু হয় তা বুঝতে হবে: execসিস্টেম কলটি বর্তমান পিআইডি সংরক্ষণ করে বর্তমানে চলমান প্রোগ্রামকে একটি নতুন সাথে প্রতিস্থাপন করে । সুতরাং একটি স্বতন্ত্র প্রক্রিয়াটি তৈরি করার উপায়টি হ'ল প্রথমে forkএবং তারপরে exec, শিশু প্রক্রিয়াটিতে চলমান প্রোগ্রামকে কাঙ্ক্ষিত প্রোগ্রামের সাথে প্রতিস্থাপন করা।

এই শেল কমান্ডের উপাদানগুলি হ'ল:

  1. প্রথম বন্ধনীগুলি (...)একটি সাব-শেল শুরু করে: BASH এর আর একটি উদাহরণ।
  2. killকমান্ড এই প্রক্রিয়া, যা এটি স্থগিত দশায় রাখে বাধা সংকেত পাঠায়।
  3. আপনি প্রক্রিয়াটি চালিয়ে যাওয়ার অনুমতি দেওয়ার সাথে সাথে (এটিকে CONTসংকেত প্রেরণ করে ) execকমান্ডটি এটি আপনার পছন্দসই প্রোগ্রামের সাথে নিজেকে প্রতিস্থাপন করবেmy_commandসাব-শেলের মূল পিআইডি রাখে।
  4. $!প্রক্রিয়াটির পিআইডি পেতে আপনি পরিবর্তনশীলটি ব্যবহার করতে পারেন ।

2
আমি এটি পছন্দ করি, কারণ এটি মৌলিকভাবে সঠিক (কেবল তার -s STOPপরিবর্তে আমাকে ব্যবহার করতে হয়েছিল -SIGSTOP)। তবুও অবাক: কেন এর $BASHPIDপরিবর্তে থাকতে হবে $$? (আমি সম্ভবত পার্থক্যটি বুঝতে পারি না)।
Hibou57

1
জন্য $$বনাম $BASHPID, আমি চেক আধুনিক উপ-শেলের PID,, যখন সাবেক নয়। একটি মজার বিষয় আছে: ব্যাশ স্ক্রিপ্টে টিপ প্রয়োগ করা, প্রায়শই ব্যর্থ হয় এবং আমাকে এই জাতীয় কিছু করতে হয়: PID=$!; ps -p $PID; kill -s CONT $PID;… আমি যদি ps -p $PIDঅংশটি সরিয়ে ফেলি তবে এটি ব্যর্থ হয় : প্রক্রিয়াটি কোথাও কোনও ত্রুটি বার্তা ছাড়াই অদৃশ্য হয়ে গেছে (নিহত?) বলে মনে হচ্ছে । এটি একটি ইন্টারেক্টিভ শেল থেকে ঠিক আছে, সমস্যাটি কেবল স্ক্রিপ্ট থেকে। এটা অনেক রহস্যজনক।
Hibou57

আমি আমার_কম্যান্ডের ফাইল বর্ণনাকারীদের তালিকা দেওয়ার জন্য এই সমাধানটি ব্যবহার করার চেষ্টা করেছি। ( goo.gl/cNbUE8 ) তবে বর্ণনাকারীরা এখনও আমার_কম্যান্ড কোনটিই ম্যাথারে নেই।
rasty.g

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