मैं उपयोगकर्ता द्वारा CPU उपयोग की निगरानी कैसे कर सकता हूं?


15

मुझे दो सर्वरों (उबंटू और सेंटो) के उपयोगकर्ताओं द्वारा सीपीयू उपयोग की निगरानी करने की आवश्यकता है। उदाहरण के लिए:

user1     5%
user2    10%
...

वहाँ एक उपकरण के समान है topया htopजो ऐसा कर सकता है?


क्या आपको वास्तविक समय में प्रदर्शित होने के लिए शीर्ष की आवश्यकता है? अन्यथा, आप top -u userपरिणाम को फ़ाइल में पुनर्निर्देशित कर सकते हैं , और फिर किसी अन्य उपयोगकर्ता की निगरानी कर सकते हैं। फिर आप एक निश्चित अंतराल पर अपने उपयोगकर्ताओं के लिए उपयोग की निगरानी करेंगे।
लॉरेंट सी।

जब आप कहते हैं कि किस अवधि पर निगरानी रखें? एक बार थोड़ी देर में या लगातार?
slm

मैं शीर्ष जैसे realtime में उपयोगकर्ताओं की निगरानी करने में सक्षम होने की उम्मीद कर रहा हूँ।
बजे रुस्तम

जवाबों:


17

वर्तमान में लॉग इन किए गए प्रत्येक उपयोगकर्ता के लिए कुल CPU उपयोग को मुद्रित करने के लिए एक स्क्रिप्ट है , showPerUserCPU.sh :

own=$(id -nu)
cpus=$(lscpu | grep "^CPU(s):" | awk '{print $2}')

for user in $(who | awk '{print $1}' | sort -u)
do
    # print other user's CPU usage in parallel but skip own one because
    # spawning many processes will increase our CPU usage significantly
    if [ "$user" = "$own" ]; then continue; fi
    (top -b -n 1 -u "$user" | awk -v user=$user -v CPUS=$cpus 'NR>7 { sum += $9; } END { print user, sum, sum/CPUS; }') &
    # don't spawn too many processes in parallel
    sleep 0.05
done
wait

# print own CPU usage after all spawned processes completed
top -b -n 1 -u "$own" | awk -v user=$own -v CPUS=$cpus 'NR>7 { sum += $9; } END { print user, sum, sum/CPUS; }'

और यहां सभी उपलब्ध उपयोगकर्ताओं के CPU उपयोग को प्रिंट करने के लिए थोड़ा संशोधित संस्करण है (लेकिन शून्य के सीपीयू उपयोग के साथ लोगों को छोड़ देना), showAllPerUserCPU.sh :

own=$(id -nu)
cpus=$(lscpu | grep "^CPU(s):" | awk '{print $2}')

for user in $(getent passwd | awk -F ":" '{print $1}' | sort -u)
do
    # print other user's CPU usage in parallel but skip own one because
    # spawning many processes will increase our CPU usage significantly
    if [ "$user" = "$own" ]; then continue; fi
    (top -b -n 1 -u "$user" | awk -v user=$user -v CPUS=$cpus 'NR>7 { sum += $9; } END { if (sum > 0.0) print user, sum, sum/CPUS; }') &
    # don't spawn too many processes in parallel
    sleep 0.05
done
wait

# print own CPU usage after all spawned processes completed
top -b -n 1 -u "$own" | awk -v user=$own -v CPUS=$cpus 'NR>7 { sum += $9; } END { print user, sum, sum/CPUS; }'

पहला कॉलम उपयोगकर्ता नाम, दूसरा कॉलम एग्रीगेटेड सीपीयू उपयोग और तीसरा कॉलम सामान्य सीपीयू का उपयोग सीपीयू की संख्या के अनुसार करता है।

प्रत्येक उपयोगकर्ता के लिए कुल मेमोरी उपयोग दिखाने के लिए एक संबंधित स्क्रिप्ट भी है : showPerUserMem.sh

लाइव-मॉनिटरिंग के लिए बस समय-समय पर watchकमांड के माध्यम से इन लिपियों को निष्पादित करें ।

CPU उपयोग द्वारा छांटने के लिए, आउटपुट को पाइप करें sort -k2 -nr


1
क्यों आप स्क्रिप्ट वेरिएबल के साथ bash env वैरिएबल को मिक्स कर रहे हैं इसका मतलब $ USER पहले से मौजूद है, यहाँ तक कि सभी कैप्स वैरिएबल भी हैं?
राहुल पाटिल

मुझे नहीं लगता कि सभी अपरकेस चर पर्यावरण चर होने चाहिए। लेकिन मैं मानता हूं कि पहले से ही विद्यमान चर को ओवर राइट करना बहुत अच्छी शैली नहीं है।
scai

1
आम तौर पर बैश में UPPERCASE का उपयोग करना एक बुरा विचार है, जिस कारण से राहुल ने इसका उल्लेख किया। यह और भी बदतर है जब आप एक चर के नाम का उपयोग कर रहे हैं पहले से ही एक पर्यावरण एक (एन बैश के रूप में मौजूद है, $USERअपने उपयोगकर्ता नाम, पहले से ही है तो केन्द्र शासित प्रदेशों के रूप में एक ही है id -nuआदेश का प्रयोग कर रहे मैं अपनी पोस्ट को संपादित किया है इसे बदलने के
terdon

शेल स्क्रिप्ट में अपरकेस वैरिएबल का उपयोग करना निश्चित रूप से एक बुरा विचार नहीं है क्योंकि मेरी /etc/init.d/निर्देशिका में दस में से नौ स्क्रिप्ट ऐसा कर रही हैं। इसके विपरीत मौजूदा पर्यावरण चर को अधिलेखित करने से बचना चाहिए।
scai

1
मैंने हर उपयोगकर्ता को शामिल करने के लिए एक संस्करण जोड़ा , न कि केवल वर्तमान में लॉग इन किया।
scai
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.