অগ্রদূত বা পটভূমিতে এটি চলছে কিনা তা জানার কোনও উপায় কি বাশ স্ক্রিপ্টের জন্য রয়েছে এবং তাই এটি প্রতিটি ক্ষেত্রে কিছুটা আলাদা আচরণ করতে পারে?
অগ্রদূত বা পটভূমিতে এটি চলছে কিনা তা জানার কোনও উপায় কি বাশ স্ক্রিপ্টের জন্য রয়েছে এবং তাই এটি প্রতিটি ক্ষেত্রে কিছুটা আলাদা আচরণ করতে পারে?
উত্তর:
উদ্ধৃতি man ps
:
Here are the different values that the s, stat and state output
specifiers (header "STAT" or "S") will display to describe the state of
a process.
...
+ is in the foreground process group
সুতরাং আপনি একটি সহজ চেক সম্পাদন করতে পারে:
case $(ps -o stat= -p $$) in
*+*) echo "Running in foreground" ;;
*) echo "Running in background" ;;
esac
পূর্ববর্তী সমস্ত সমাধানগুলি স্পোনিং প্রক্রিয়াগুলি ইত্যাদির সাথে জড়িত Very খুব, খুব কুরুচিপূর্ণ, যেহেতু .bashrc
প্রতিবার ব্যাশ শেল চালু হওয়ার সময় বলা হয়, সুতরাং সেই সমাধানগুলি 1000 এর প্রক্রিয়াগুলির প্রবর্তনকে শেষ করে।
অনেক ক্লিনার বাশকে নিজেই জিজ্ঞাসা করছে: ব্যাশের একটি পূর্বনির্ধারিত ভেরিয়েবল রয়েছে $-
যা ইন্টারেক্টিভ শেলটিতে চললে "i" থাকে। উদাহরণস্বরূপ, আপনার .bashrc এ এটি স্থাপন করা অনেক পরিষ্কার এবং অনেক সস্তা এবং সবচেয়ে গুরুত্বপূর্ণ, সবসময় কাজ করবে!
case "$-" in
*i*) # interactive shell
;;
esac
আপনি যখন ভাবতে পারেন যে শেলটি ইন্টারেক্টিভ মোডে চালিত হচ্ছে কিনা তা পরীক্ষা করা একই ফল দেবে, বাস্তবে, এটি নয়। ধারণাটি দেখতে একই রকম তবে বাস্তবে ভিন্ন। প্রত্যাশার জন্য আপনি ব্যাকগ্রাউন্ড ফিডিং ইনপুটটিতে একটি ইন্টারেক্টিভ স্ক্রিপ্ট চালাতে পারেন । এছাড়াও, আপনি -l
যুক্তি দিয়ে আপনার স্ক্রিপ্টটি ব্যাশ দিয়ে চালু করতে পারেন । আমাদের স্ক্রিপ্টটি ব্যাকগ্রাউন্ডে বা সম্মুখভাগে চালিত হয়েছে কিনা তা পরীক্ষা করার জন্য আমরা বাশ ইন্টারেক্টিভিটির উপর নির্ভর করতে পারি না।
ডিভনুলের উত্তর এইভাবে সঠিক । অগ্রভাগে প্রক্রিয়াটি চলছে কিনা তা নির্ধারণ করতে, পিএস ইউটিলিটি পরীক্ষা করে দেখায় যে প্রসেস গ্রুপ (pgrp) সেশনটির নিয়ন্ত্রণকারী টার্মিনাল (টিপিজিড) এর সাথে সম্পর্কিত প্রসেস গ্রুপ আইডির সমান এবং প্রক্রিয়া+
অনুসারে আউটপুটে একটি চিহ্ন যোগ করে অবস্থা.
এটি জেনে, আমরা অবশ্যই পরীক্ষার খাঁটি বাশ সংস্করণ রাখতে পারি:
#!/usr/bin/env bash
IFS=$' '
retval=($(</proc/$$/stat))
IFS=$' \t\n'
if [[ "${retval[3]}" == "${retval[7]}" ]]; then
echo "Background" > ./result.txt
else
echo "Foreground" > ./result.txt
fi
exit
উপরের কোডে, আমরা ফলাফলটিকে একটি পাঠ্য ফাইলে আউটপুট দিচ্ছি কারণ stdout
পটভূমিতে যখন কোনও প্রক্রিয়া চালিত হয় তখন সংযুক্ত থাকে না।
দয়া করে 4 র্থ মনে রাখবেন টেবিলের 8th উপাদান যথাক্রমে মিলা pgrp
এবং tpgid
( দেখতে জন্য / proc / [PID] / পরিসংখ্যান মানুষ পৃষ্ঠার অধ্যায় - man 5 proc
)।