How to find PID's user name in linux

95,970

Solution 1

I'm surprised nobody has put this up yet:

Try the -p option to the ps command.

For instance, if you have PID 1234, run:

ps -u -p 1234

(The -u was added to include the username in the output)

You can the use grep or awk, etc. to extract the info you want.

Solution 2

/proc/processID/status will have the information about user's ID which you can use to find the username.

This does the same:

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

Replace YOUR_PROCESS_ID with your process ID number.

Solution 3

Get only username from a PID:

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

You can also combine it with a pgrep. In this example we show all usernames executing some .php file:

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

Find only one username running a certain unique process:

USERNAME="$( pgrep -nf 'script\.php' | xargs -r ps -o uname= -p )

Solution 4

I think the shortest way is:

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

The /proc/<pid>/loginuid file has the uid number of the user running the process; id -nu reads uid from stdin and returns a user name.

Solution 5

What do you want exactly? On my system, if I run 'top -c' I get:

  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]                                                                                                              

So the PID (processus/task identifier) is the first column, and the user account the processus runs under is the second column

Share:
95,970

Related videos on Youtube

Ranjithkumar T
Author by

Ranjithkumar T

Updated on September 18, 2022

Comments

  • Ranjithkumar T
    Ranjithkumar T over 1 year

    Can you help me to find the PID's user name, Some time my server got high load. When i top -c, I cannot even find the PID's user name who / which is causing load on the server.

    • Admin
      Admin over 8 years
      We were experiencing server load issue due to bulk php process, so that i had this question, we can then find them using 'lsof -p xxxx'.
  • ott--
    ott-- over 8 years
    You were a tick faster than me. You're waking up earlier? Depending on the Linux distrbution, ps u 1234 (Debian) or just ps 1234 (Android with Busybox) also works.
  • Cory Robinson
    Cory Robinson over 4 years
    Nice. Is there a file of uid to user names that you can map the loginuid to a string user name?
  • Jdamian
    Jdamian almost 3 years
    That does not work
  • dess
    dess over 2 years
    Good answer, one of the best, but needs correction a bit. This will work (bash example): id -nu $(< /proc/<pid>/loginuid) (to work with any POSIX shell sholud be escaped with backticks instead of "$( )" bash construction). The answer with ps is more flexible, you can get also real and saved user name. But this answer command is several times faster than ps --no-headers -o euser -p <pid>.
  • dess
    dess over 2 years
    The best answer, since it's the fastest, especially if changed to : getent passwd $(< /proc/"$uid"/loginuid) | sed 's/\:.*$//'
  • Community
    Community about 2 years
    Your answer could be improved with additional supporting information. Please edit to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers in the help center.