[bash] - skrypt wyszukiwający największe obciążenie CPU

potrzebuję skrypt który wyszukiwałby program najbardziej obciążający procesor- na podstawie podanych zmiennych- wartości zużycia CPU od na przykład 80 - do 100% (czasami jakis program się zawiesi i zużywa cały procesor) i pytałby się użytkownika czy ma go automatycznie zakończyć?

Czemu google nie użyjesz? Pierwszy z brzegu, ze dwie linie zmienić do własnych potrzeb:

http://unix.stackexchange.com/questions/66786/bash-script-that-automatically-kills-processes-when-cpu-memory-usage-gets-too-hi

W Bashu pewna zmienna określa porządek sortowania. Wystarczy posłużyć się sort i upewnić się, że zmienna ta odpowiednio potraktuje liczby(nie jako zwyczajne ciągi znaków). Następnie trzeba znaleźć polecenie, które wyświetla zużycie CPU dla poszczególnych procesów

Znalazłem już te funkcje:

ps -eo pcpu,pmem,pid,cmd | sort -k 1 -nr | head -n 1
ps aux | awk '{ print $8 " " $2 }' | grep -w Z

zrobiłem wersję roboczą skryptu, zanim je jednak zaimplementuję prosiłbym o wyszukanie w nim błędu:

#!/bin/bash

clear
question ()
{
echo 'Wybierz parametr według którego chcesz zniszczyć proces'
echo 1 - proces najbardziej obciążający CPU
echo 2 - proces najbardziej obciążający RAM
echo 3 - procesy "zombie"
echo 0 - zakończ program.

read key

if ["$key" != 0] || ["$key" != 1] || ["$key" != 2] || ["$key" != 3]
then
echo bledny wybor
fi

case "$key" in
	1)
		echo "you typed 'CPU'"
echo press key...
read
clear
question
		;;
	2)
		echo "you typed 'RAM'"
echo press key...
read
clear
question
		;;
	3)
		echo "you typed 'zombie'"
echo press key...
read
clear
question
		;;
	0)
		echo "bye..."
		;;
esac
}
question

bo warunek funkcji if (błędny wybór) wyświetla przy każdym klawiszu, a powinien tylko w przypadku innym niż 0 1 2 i 3.

 

Na moje źle rozwiązałeś to logicznie: zamiast lub, między warunkami powinieneś mieć i. Wydaje mi się też że case od *) byłby bardziej eleganckim rozwiązaniem.

Zawsze najtrudniej jest wpaść na najprostsze rozwiązanie. Oczywiście diabeł tkwi w szczegółach :mrgreen:

Zmiana operatora z || na && i gitara:)

Odwracanie kota ogonem.

Dajesz logiczne lub, tylko usuwasz negację z każdego z warunków.

…i negujesz całość. :stuck_out_tongue:

Potrzebuję polecenia, wyświetlałoby numer PID procesu, który najbardziej obciąża CPU. Tutaj przykład który nie działa jak należy:

ps -eo pcpu,pmem,pid,cmd | sort -k 1 -r | grep -v %CPU | head -n 1 | cut -d' ' -f3

chodzi przede wszystkim o wycięcie polecenia cut - w którym delimiter jest często zmienny (w zależności od ilości cyfr w PID). Potrzebuję precyzyjnie wyobrębnić numer PID który działałby zawsze

No to pokaż z 5-6 wyników i co oczekujesz na wyjściu…

Na wyjściu oczekuję PID procesu który najbardziej obciąża procesor, a owe polecenie czasami poprostu nic nie wyświetla.

To daj z 10 przykładów bez cut.

Przykłady:

19:31[user1@arch ~]$ ps -eo pcpu,pmem,pid,cmd | sort -k 1 -r | grep -v %CPU | head -n 1
12.0 0.7 727 mate-terminal
19:31[user1@arch ~]$ ps -eo pcpu,pmem,pid,cmd | sort -k 1 -r | grep -v %CPU | head -n 1
 4.7 0.9 462 /usr/lib/xorg-server/Xorg -nolisten tcp :0 vt1 -auth /tmp/serverauth.HHgedMoG8f
19:31[user1@arch ~]$ ps -eo pcpu,pmem,pid,cmd | sort -k 1 -r | grep -v %CPU | head -n 1
50.9 11.5 775 firefox
19:31[user1@arch ~]$ ps -eo pcpu,pmem,pid,cmd | sort -k 1 -r | grep -v %CPU | head -n 1
19.9 10.7 775 firefox
19:32[user1@arch ~]$ ps -eo pcpu,pmem,pid,cmd | sort -k 1 -r | grep -v %CPU | head -n 1
 5.5 1.0 462 /usr/lib/xorg-server/Xorg -nolisten tcp :0 vt1 -auth /tmp/serverauth.HHgedMoG8f

zależy od ilości cyfr PID - bo delimiter cut “widzi” wówczas inne odstępy. Poprostu chcę wyodrębnić sam numer PID. Jest na to jakiś prosty sposób?