স্ক্রিপ্ট থেকে একটি পটভূমি প্রক্রিয়া শুরু করুন এবং স্ক্রিপ্টটি শেষ হয়ে গেলে এটি পরিচালনা করুন


15

আমি স্ক্রিপ্ট থেকে ডেমনের অনুরূপ একটি প্রক্রিয়া চালাতে ও কনফিগার করতে চাই।
আমার শেলটি সাইগউইনের অধীনে জেডএস এমুলেটেড এবং ডেমন এসএফকে , একটি বেসিক এফটিপি সার্ভার।

এখানে গুরুত্বপূর্ণ বিষয়গুলির জন্য, স্ক্রিপ্টটি startserv.shনিম্নরূপ খসড়া করা যেতে পারে:

#!/bin/sh
read -s -p "Enter Password: " pw
user=testuser
share=/fshare
cmd="sfk ftpserv -user=$user -pw=$pw -usedir $share=$share"
$cmd &

স্ক্রিপ্টটি চালানোর পরে startserv.sh, কোনও প্রম্পট না দেখিয়ে এটি থামবে (শেষ?), তারপরে:

  • CTRL+ Cস্ক্রিপ্ট এবং পটভূমি উভয় কাজ প্রক্রিয়া শেষ করে;

  • Enterস্ক্রিপ্ট হিট করার প্রক্রিয়াটি পটভূমিতে থেকে যায়।

যাইহোক আমি কেবল এটির মাধ্যমে দেখতে পাচ্ছি psএবং না jobs, সুতরাং, যখন আমি প্রক্রিয়াটি বন্ধ করতে চাই, আমাকে একটি নৃশংস kill -9সংকেত পাঠাতে হবে , এটি এমন একটি বিষয় যা আমি CTRL+ এর পক্ষে এড়াতে চাই C

একটি বিকল্প পটভূমিতে পুরো স্ক্রিপ্ট চলমান হবে । 'হবে', তবে readস্ক্রিপ্টটি চলমান থাকলে কমান্ডটি ব্যবহারকারী ইনপুট পেতে অক্ষম startserv.sh &

নোট করুন যে আমার একটি ইফেমেরাল সার্ভারের দরকার, সত্য ডেমোন নয় : এটি হ'ল আমি চাই যে সার্ভার প্রক্রিয়াটি পটভূমিতে চলুক, স্ক্রিপ্টটি শেষ হওয়ার পরে, সহজ ইন্টারেক্টিভ শেল কার্য সম্পাদন করতে (ভার্চুয়াল মেশিন গেস্টের সাথে), তবে আমি করি না ' শেলের বেঁচে থাকার জন্য প্রক্রিয়াটির প্রয়োজন নেই; সুতরাং nohupউপযুক্ত মনে হয় না।


ব্যবহার করে পটভূমিতে চলমান প্রক্রিয়াটির আইডি পান bgproc="$!"এবং তারপরে command "$bgproc" যথাযথ ব্যবস্থা গ্রহণ করুন। এছাড়াও দেখুন স্ট্যাকওভারফ্লো.com
ভ্যালেন্টাইন বাজরামি

আপনি একটি পিআইডি ফাইলও তৈরি করতে পারেন। তারপরে ফাইলটি পড়ুন এটি কী প্রক্রিয়া নম্বর তা দেখতে এবং সেখান থেকে যান।
jgr208

উত্তর:


18

Enterস্ক্রিপ্ট হিট করার প্রক্রিয়াটি পটভূমিতে থেকে যায়।

প্রায়! প্রকৃতপক্ষে, স্ক্রিপ্টটি আপনি চাপ দেওয়ার সময় ইতিমধ্যে উপস্থিত হয়ে গেছে Enter। তবে, আপনি কীভাবে আপনার প্রম্পটটি ফিরে পেতে পারেন (কারণ আপনার শেলটি $PS1আবার এটি মুদ্রণ করে )।

মারতে Ctrl+ কেন Cউভয়কেই সমাপ্ত করার কারণ হ'ল এগুলির দুটি লিঙ্কযুক্ত। আপনি যখন আপনার স্ক্রিপ্টটি কার্যকর করেন, আপনার শেল এটি চালানোর জন্য একটি সাব-শেল শুরু করে। আপনি যখন এই সাবশেলটি বন্ধ করবেন, আপনার পটভূমি প্রক্রিয়াটি সম্ভবত কোনও SIGHUPসংকেত থেকে মারা যায় ।

স্ক্রিপ্ট, পটভূমি প্রক্রিয়া এবং সাবশেল পৃথক করুন

ব্যবহার করে nohup, আপনি এই সামান্য অসুবিধা থেকে মুক্তি পেতে সক্ষম হতে পারে।

#!/bin/sh
read -s -p "Enter Password: " pw
user=testuser
share=/fshare
cmd="sfk ftpserv -user=$user -pw=$pw -usedir $share=$share"
nohup $cmd &

disownবিকল্প

আপনার কাছ থেকে সুইচ করতে পারেন /bin/shথেকে /bin/bash, আপনি ব্যবহার করে দেখুন দিতে পারেন disownহিসাবে ভাল। আরও জানতে, কেবল help disownএকটি bashউদাহরণ টাইপ করুন ।

disown -h $cmd &

পটভূমি প্রক্রিয়াটিকে "সুন্দরভাবে" হত্যা করা হচ্ছে

এখন, যখন আপনার প্রক্রিয়াটি হত্যার বিষয়টি আসে, আপনি ব্যবহার করে পুরোপুরি একটি " Ctrl+ C" করতে পারেন kill। শুধু একটি নৃশংস প্রেরণ না SIGKILL। পরিবর্তে, আপনি ব্যবহার করতে পারেন:

$ kill -2 [PID]
$ kill -15 [PID]

যা আপনার প্রক্রিয়াটিতে একটি দুর্দান্ত SIGINT(2) বা SIGTERM(15) প্রেরণ করবে । প্রক্রিয়া শুরু করার পরে আপনি পিআইডি মানটি মুদ্রণ করতেও পারেন:

...
nohup $cmd &
echo $!

... বা আরও ভাল, স্ক্রিপ্টটি একটির জন্য অপেক্ষা করুন SIGINT, এবং এটি ব্যাকগ্রাউন্ড প্রক্রিয়াতে ফেরত পাঠান (এটি আপনার স্ক্রিপ্টটিকে অগ্রভাগে রাখবে যদিও) :

#!/bin/sh
read -s -p "Enter Password: " pw
user=testuser
share=/fshare
cmd="sfk ftpserv -user=$user -pw=$pw -usedir $share=$share"
nohup $cmd &

# Storing the background process' PID.
bg_pid=$!

# Trapping SIGINTs so we can send them back to $bg_pid.
trap "kill -2 $bg_pid" 2

# In the meantime, wait for $bg_pid to end.
wait $bg_pid

যদি SIGINTপর্যাপ্ত পরিমাণ না থাকে তবে কেবল একটি SIGTERMপরিবর্তে (15) ব্যবহার করুন:

trap "kill -15 $bg_pid" 2 15

এইভাবে, যখন আপনার স্ক্রিপ্টটি একটি SIGINT( Ctrl+ C, kill -2) বা পটভূমি প্রক্রিয়াটির জন্য SIGTERMযখন কিছুটা সময় পাবে wait, এটি কেবলমাত্র এটিতে সিগন্যালগুলি রিলে দেবে। যদি এই সংকেতগুলি sfkউদাহরণটি না দেয়, তবে waitকলটি ফিরে আসবে, সুতরাং আপনার স্ক্রিপ্টটিও সমাপ্ত করে :)


1
+1 খুব তথ্যপূর্ণ। যেহেতু স্ক্রিপ্টটি একটি সাব-শেলের মধ্যে চলে, তাই স্ক্রিপ্টের পিতামাতার শেলের স্ক্রিপ্ট থেকে কাজের টেবিলে প্রবেশের কোনও সম্ভাবনা আছে? jobsস্ক্রিপ্ট শেষ হওয়ার পরে টার্মিনালে জারি করা তালিকার কাজ (পরিবর্তে ps)।
অ্যান্টোনিও

1
কাজগুলি আপনার বর্তমান শেলের সাথে সম্পর্কিত, সেগুলি একটি শেল থেকে অন্য শেলটিতে স্থানান্তরিত হয় না। যখন আপনার সাবশেল মারা যায়, এর কাজগুলি পুনরুদ্ধার হয় না। আপনার ব্যাকগ্রাউন্ড প্রক্রিয়া 'পিআইডি' প্রিন্ট করে আপনি নিশ্চিত করেছেন যে সাব-শেলটি ( pid -p) সমাপ্ত হওয়ার পরেও আপনি সহজেই এ সম্পর্কে তথ্য পেতে পারেন ।
জন ডব্লিউ এইচ স্মিথ

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