ฉันต้องตรวจสอบการใช้งาน CPU โดยผู้ใช้เซิร์ฟเวอร์สองเครื่อง (Ubuntu และ CentOS) ตัวอย่างเช่น:
user1 5%
user2 10%
...
มีเครื่องมือคล้ายtop
หรือhtop
ว่าสามารถทำเช่นนั้น?
ฉันต้องตรวจสอบการใช้งาน CPU โดยผู้ใช้เซิร์ฟเวอร์สองเครื่อง (Ubuntu และ CentOS) ตัวอย่างเช่น:
user1 5%
user2 10%
...
มีเครื่องมือคล้ายtop
หรือhtop
ว่าสามารถทำเช่นนั้น?
คำตอบ:
นี่คือสคริปต์สำหรับพิมพ์การใช้งาน 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 ของผู้ใช้ที่มีอยู่ทั้งหมด (แต่ข้ามการใช้งาน 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; }'
คอลัมน์แรกแสดงถึงชื่อผู้ใช้คอลัมน์ที่สองของการใช้ CPU ที่รวบรวมและคอลัมน์ที่สามที่ CPU ที่ใช้เป็นมาตรฐานตามจำนวนแกน CPU
นอกจากนี้ยังมีสคริปต์ที่เกี่ยวข้องสำหรับการแสดงการใช้หน่วยความจำทั้งหมดสำหรับผู้ใช้แต่ละคน: showPerUserMem.sh
สำหรับการตรวจสอบสดเพียงแค่รันสคริปต์เหล่านี้เป็นระยะ ๆ ผ่านทาง watch
คำสั่ง
สำหรับการเรียงลำดับตามการใช้งาน CPU sort -k2 -nr
ท่อออกไป
$USER
เป็นชื่อผู้ใช้ของคุณแล้วดังนั้นจึงเหมือนกับid -nu
คำสั่งที่คุณใช้อยู่ฉันแก้ไขโพสต์ของคุณเพื่อเปลี่ยนแปลงสิ่งนี้
/etc/init.d/
ไดเรกทอรีของฉันกำลังทำสิ่งนี้เช่นกัน ควรหลีกเลี่ยงการเขียนทับตัวแปรสภาพแวดล้อมที่มีอยู่ในทางตรงกันข้าม
top -u user
และเปลี่ยนเส้นทางผลลัพธ์ไปยังไฟล์จากนั้นตรวจสอบผู้ใช้รายอื่น จากนั้นคุณจะมีการตรวจสอบการใช้ proc สำหรับผู้ใช้ของคุณในช่วงเวลาที่กำหนด