কোনও ব্যাক স্ক্রিপ্ট কীভাবে সনাক্ত করতে পারে যদি এটি পটভূমিতে চলছে?


28

অগ্রদূত বা পটভূমিতে এটি চলছে কিনা তা জানার কোনও উপায় কি বাশ স্ক্রিপ্টের জন্য রয়েছে এবং তাই এটি প্রতিটি ক্ষেত্রে কিছুটা আলাদা আচরণ করতে পারে?


নোট করুন যে কোনও প্রক্রিয়া কাজের নিয়ন্ত্রণের কারণে অগ্রভাগ থেকে পটভূমিতে যেতে পারে এবং তদ্বিপরীত হয়।
বার্মার

উত্তর:


30

উদ্ধৃতি 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

নিশ্চয়ই $ (...) এর মধ্যে যা কিছু আহ্বান করা হয়েছে তা নিজেই পটভূমিতে চলছে ....? আমি অনুমান করি যে প্রক্রিয়া গ্রুপটি গুরুত্বপূর্ণ বিষয় যদিও এটি অস্বীকার করতে পারে না যে এটি কাজ করে।
এড র্যান্ডাল

2

ফাইল /etc/bash.bashrc দেখুন "।

"$ PS1" রয়েছে এমন লাইন। তারপরে একটি "ম্যান বাশ" করুন এবং টোকেন পিএস 1 সন্ধান করুন।

[ -z "$PS1" ] && return

ইন্টারেক্টিভ নয় এমন স্ক্রিপ্ট থেকে প্রস্থান করে।


1

পূর্ববর্তী সমস্ত সমাধানগুলি স্পোনিং প্রক্রিয়াগুলি ইত্যাদির সাথে জড়িত Very খুব, খুব কুরুচিপূর্ণ, যেহেতু .bashrcপ্রতিবার ব্যাশ শেল চালু হওয়ার সময় বলা হয়, সুতরাং সেই সমাধানগুলি 1000 এর প্রক্রিয়াগুলির প্রবর্তনকে শেষ করে।

অনেক ক্লিনার বাশকে নিজেই জিজ্ঞাসা করছে: ব্যাশের একটি পূর্বনির্ধারিত ভেরিয়েবল রয়েছে $-যা ইন্টারেক্টিভ শেলটিতে চললে "i" থাকে। উদাহরণস্বরূপ, আপনার .bashrc এ এটি স্থাপন করা অনেক পরিষ্কার এবং অনেক সস্তা এবং সবচেয়ে গুরুত্বপূর্ণ, সবসময় কাজ করবে!

case "$-" in 

    *i*) # interactive shell

    ;;
esac

তুমি কেন ছিলে? যে সৌন্দর্য খুব খুব বিশ্রী ...
Pierre.Vriens

সহজ, সঠিক সমাধান।
এড র্যান্ডাল

0

আপনি যখন ভাবতে পারেন যে শেলটি ইন্টারেক্টিভ মোডে চালিত হচ্ছে কিনা তা পরীক্ষা করা একই ফল দেবে, বাস্তবে, এটি নয়। ধারণাটি দেখতে একই রকম তবে বাস্তবে ভিন্ন। প্রত্যাশার জন্য আপনি ব্যাকগ্রাউন্ড ফিডিং ইনপুটটিতে একটি ইন্টারেক্টিভ স্ক্রিপ্ট চালাতে পারেন । এছাড়াও, আপনি -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)।

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