2010-10-06 15 views

Odpowiedz

6

spróbuj tego:

ps -u "$(echo $(w -h | cut -d ' ' -f1 | sort -u))" o user= | sort | uniq -c | sort -rn 

W celu prawidłowej obsługi nazw użytkownika, które mogą być dłuższe niż osiem znaków, zamiast korzystania usersw. Ten drugi obcina nazwy użytkowników.

ps -u "$(echo $(printf '%s\n' $(users) | sort -u))" o user= | sort | uniq -c | sort -rn 
+1

Właśnie tego potrzebowałem, dziękuję !!! – Vidi

+0

Niestety 'w -h' obcina nazwy użytkowników do 8 znaków, wyświetla również tylko zalogowanych użytkowników, aby nie widzieć wszystkich użytkowników, wystarczy zalogować użytkowników. –

+1

@OliverDungey: OP zażądał dla użytkowników, którzy są aktualnie zalogowani. Jeśli chcesz procesów dla wszystkich użytkowników, niezależnie od tego, czy są zalogowani, to nie potrzebujesz 'w' - możesz po prostu użyć' ps' (który może zrobić, aby wyświetlać długie nazwy użytkownika w całości). Komenda 'users' pokazuje zalogowanych użytkowników i wydaje się nie przecinać nazw. Moja odpowiedź mogłaby zostać dostosowana do jej użycia. Zaktualizuję moją odpowiedź. –

12

można spróbować jakąś odmianę tego.

ps haux Ou | cut '-d ' -f1 | uniq -c 

Daje liczbę procesów dla każdego użytkownika (zalogowanego lub nie). Teraz można filtrować te wyniki za pomocą wyjścia polecenia W lub innego sposobu ustalania, kto jest zalogowany.

+0

Nice! Można dodać 'grep 'pts \ | tty'' przed cięciem, wycina wszelkie procesy nie związane z terminalem. – zigdon

2
ps -u aboelnour | awk 'END {print NR}' 

pokaże liczbę procesów, które użytkownik aboelnour uruchomienie go

+1

'wc -l' działa równie dobrze jak polecenie awk. –

0
userlist=$(w|awk 'BEGIN{ORS=","}NR>2{print $1}'|sed 's/,$//') 
ps -u "$userlist" 
+0

Użyłem tego w połączeniu z odpowiedzią Aboelnoura, ale daje mi to liczbę procesów bez odpowiedniego użytkownika tych procesów. Jaki jest pomysł, jak to naprawić? – Vidi

1

Jeśli chcesz tylko rachubę procesów można użyć procfs bezpośrednio tak: (wymaga Linux 2.2 lub wyższy)

można użyć WC:

number_of_processes=`echo /proc/[0-9]* | wc -w` 

lub zrobić w czystej bash (bez zewnętrznych poleceń), takich jak ten

Jeśli chcesz tylko bieżące wykorzystanie pozbyć

procs=(/proc/[0-9]*/fd/.) 
number_of_proccesses=${#procs[*]} 
0

Oto moje rozwiązanie dla Linux:

$ find/proc -user $ USER -maxdepth 1 -name '[0-9] *' | wc -l

To rozwiązanie nie zawiedzie, gdy liczba procesów przekroczy limit wiersza poleceń.

1

Jeśli kiedykolwiek obawiasz się ograniczenia limitu procesu użytkownika wyświetlanego przez ulimit -a, chcesz uzyskać WSZYSTKIE procesy (w tym LWP).W takim przypadku należy użyć:

ps h -Led -o user | sort | uniq -c | sort -n 

Na jeden system w ten sposób:

ps haux Ou | cut '-d ' -f1 | uniq -c 

plonów:

# ps haux Ou | cut '-d ' -f1 | uniq -c 
30 user1 
    1 dbus 
    3 user2 
    1 ntp 
    1 nut 
    1 polkitd 
    2 postfix 
124 root 
    2 serv-bu+ 

gdzie robią dawne plony prawdziwa count proces:

# ps h -Led -o user | sort | uniq -c | sort -n 
    1 ntp 
    1 nut 
    2 dbus 
    2 postfix 
    2 serv-builder 
    3 user2 
    6 polkitd 
141 root 
444 user1 
Powiązane problemy