Comment trouver le nom d'utilisateur de PID sous Linux

17

Pouvez-vous m'aider à trouver le nom d'utilisateur du PID, Quelque temps mon serveur a reçu une charge élevée. Quand je top -c, je ne trouve même pas le nom d'utilisateur du PID qui / qui cause la charge sur le serveur.

Ranjithkumar T
la source
Nous rencontrions un problème de chargement du serveur en raison du processus php en vrac, de sorte que j'ai eu cette question, nous pouvons ensuite les trouver en utilisant 'lsof -p xxxx'.
Ranjithkumar T

Réponses:

31

Je suis surpris que personne n'ait encore mis cela en place:

Essayez l' -poption de la pscommande.

Par exemple, si vous avez un PID 1234, exécutez:

ps -u -p 1234

(Le a -uété ajouté pour inclure le nom d'utilisateur dans la sortie)

Vous pouvez utiliser grepou awk, etc. pour extraire les informations que vous souhaitez.

jwd
la source
1
Tu étais une tique plus rapide que moi. Tu te réveilles plus tôt? Selon la distribution Linux, ps u 1234(Debian) ou simplement ps 1234(Android avec Busybox) fonctionne également.
ott--
5

/proc/processID/status aura les informations sur l'ID utilisateur que vous pouvez utiliser pour trouver le nom d'utilisateur.

Cela fait de même:

uid=$(awk '/^Uid:/{print $2}' /proc/YOUR_PROCESS_ID/status)
getent passwd "$uid" | awk -F: '{print $1}'

Remplacez YOUR_PROCESS_ID par votre numéro d'identification de processus.

PP
la source
3

Obtenez uniquement le nom d'utilisateur d'un PID:

PID=136323
USERNAME="$( ps -o uname= -p "${PID}" )"

Vous pouvez également le combiner avec un pgrep. Dans cet exemple, nous montrons tous les noms d'utilisateurs exécutant un .phpfichier:

pgrep -f '\.php' | xargs -r ps -o uname= -p | sort -u

Trouvez un seul nom d'utilisateur exécutant un certain processus unique:

USERNAME="$( pgrep -nf 'script\.php' | xargs -r ps -o uname= -p )
Jeroen Vermeulen - MageHost
la source
1

Que voulez-vous exactement? Sur mon système, si je lance 'top -c' j'obtiens:

  PID USER      PR  NI  VIRT  RES  SHR S   %CPU %MEM    TIME+  COMMAND                                                                                                                        
  2873 matt      20   0 3022m 1.6g 1.6g S     22 21.6   2245:42 /usr/lib/virtualbox/VirtualBox --comment ESX5-1 --startvm 4fd78ee9-739a-4d53-a0ce-4f9819ab9411 --no-startvm-errormsgbox        
  29764matt      20   0 2779m 1.4g 1.3g S      5 18.4 210:33.51 /usr/lib/virtualbox/VirtualBox --comment win2008-2 --startvm 202ec2b7-ae12-40e9-af76-2be429e553d7 --no-startvm-errormsgbox     
  17281root      20   0     0    0    0 S      2  0.0   0:05.90 [kworker/u:2]                                                                                                              

Ainsi, le PID (identificateur de processus / tâche) est la première colonne, et le compte d'utilisateur sous lequel le processus s'exécute est la deuxième colonne

mbarthelemy
la source
1

Je pense que le chemin le plus court est:

id -nu </proc/<pid>/loginuid

Le /proc/<pid>/loginuidfichier a le numéro uid de l'utilisateur exécutant le processus; id -nulit uid depuis stdin et retourne un nom d'utilisateur.

Diego
la source
Agréable. Existe-t-il un fichier uid aux noms d'utilisateurs que vous pouvez mapper le loginuid à un nom d'utilisateur de chaîne?
Cory Robinson