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:
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ść.
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?