2011-09-16 10 views
21

ps -eafQuy trình đang chạy. Tại sao hiển thị số uid thay vì tên người dùng?

..

kude  22593 12078 0 09:06 ?  00:00:02 smbd -D 
hasi  22929 12078 0 09:12 ?  00:00:00 someprog.pl 
root  22950 43 0 Sep08 ?  00:00:19 [nfsiod] 
root  24558 43 0 Sep09 ?  00:00:28 [pdflush] 
root  25320  1 0 00:00 ?  00:00:01 /usr/bin/atop -a -w /var/log/atop/atop_20110916 600 
1466  25757 12078 0 10:12 ?  00:00:00 smbd -D 
root  26752 12078 0 10:32 ?  00:00:01 smbd -D 

..

id USERNAME2

uid = 1466 (username2) gid = 513 (nhóm người dùng miền) nhóm = 513 (người dùng miền)

Tất cả người dùng trong LDAP (/etc/nsswitch.conf là đúng, tất cả đều đúng - nhưng chỉ người dùng này không hiển thị)

Tại sao hiển thị số uid (1466) thay vì tên người dùng?

+1

Có thể vì số UID có độ dài tối đa có thể dự đoán được, trong khi tên người dùng có thể khá dài? –

+10

Có chiều dài của tên người dùng (Nếu dài hơn 8 ký tự, thì 'ps aux' sẽ thay thế uid cho tên). Chạy 'man ps' ngay để xem chi tiết. –

Trả lời

35

Có giới hạn 8 ký tự cho tên người dùng được liệt kê trong ps -ef (POSIX) hoặc ps aux (dẫn xuất BSD). Explanation of options

Tôi đã tìm kiếm trang người dùng trên cả hai máy Mac và hộp Linux và không thấy giới hạn đó được ghi lại ở đó.

Câu hỏi thường xuất hiện trên các diễn đàn có giới hạn 8 ký tự làm câu trả lời.

tôi đã cuối cùng vấp ngã khi this page trong đó "lỗi" đã được báo cáo với Debian nhưng đóng cửa như là không phải là một lỗi. Họ tham chiếu this page cũng xác nhận quyền sở hữu về cách các tiêu chuẩn POSIX và UNIX yêu cầu quay trở lại các vùng nhỏ khi tên quá dài. Cũng không phải từ tiêu chuẩn POSIX thực tế.

Tôi không biết nếu điều này là có thẩm quyền, nhưng nó giải thích hành vi bạn đang thấy với tên người dùng 9 ký tự. :)

Có thể ai đó khác có thể đăng câu trả lời cho liên kết có thẩm quyền hơn?

+0

'ps aux' là cú pháp BSD bình thường. Điều bạn đã liệt kê là BSD thay vào đó là Systax Sysax cũ. – tchrist

+0

Rất tiếc. Cảm ơn @pst. Đã sửa. –

11

Vì Ray Toal đề cập đến giới hạn 8 ký tự. Đây không phải là một lỗi mà là một phần của tiêu chuẩn một lần nữa như đã đề cập bởi Ray. Nếu bạn kiểm tra mã nguồn của ps (một phần của procps gói) một trong những ý kiến ​​nói

The Open Group Base Specifications Issue 6 (IEEE Std 1003.1, 2004 Edition) 
requires that user and group names print as decimal numbers if there is 
not enough room in the column, so tough luck if you don't like it. 

The UNIX and POSIX way to change column width is to rename it: 
    ps -o pid,user=CumbersomeUserNames -o comm 
The easy way is to directly specify the desired width: 
    ps -o pid,user:19,comm 

Nếu bạn đánh dấu vào link trong phần STDOUT nó nói rằng các lĩnh vực (dùng, ruser , nhóm, rgroup) sẽ in nếu có thể nhận được và giấy phép chiều rộng trường hoặc đại diện thập phân khác.
Lý do tại sao người dùng & độ rộng trường tên nhóm bị giới hạn là 8 có thể là legacy support nhưng đó chỉ là phỏng đoán.

3

ps -eo user:$(cut -d: -f1 /etc/passwd | wc -L),pid,ppid,c,stime,tname,time,cmd

Tùy chọn -o được sử dụng để xác định một người dùng định nghĩa định dạng cho đầu ra của lệnh ps.

Định dạng do người dùng xác định nói để xuất ra các trường người dùng, pid, ppid, stime, tname, time và cmd.

cut -d: -f1 /etc/passwd | wc -L xác định số ký tự trong tên đăng nhập dài nhất trong tệp mật khẩu. Do đó user:$(cut -d: -f1 /etc/passwd | wc -L) yêu cầu lệnh ps xuất ra trường người dùng bằng cách sử dụng độ dài tối đa của tên đăng nhập dài nhất.

+0

bạn có thể thêm một số thông tin bổ sung về lệnh đang làm không? – dmportella

0

Để có độ dài động lớn hơn mà câu trả lời của moosaka (ví dụ, nếu bạn có rất ít tên người dùng, nhưng rất hiếm khi được sử dụng và bạn không muốn màn hình bị lãng phí phần lớn thời gian), bạn có thể sử dụng:

người dùng ps -eo: $ (ps axho uid | sắp xếp -u | xargs getent passwd | cắt -f1 -d: | wc -L), pid, ppid, c, stime, tname, time, cmd

Nó sẽ làm cho chiều dài của cột tên người dùng chỉ miễn là tên người dùng dài nhất của quy trình hiện đang chạy. (Lưu ý rằng nó không phải là chống đạn tuy nhiên, và nếu quá trình mới với tên người dùng dài hơn bắt đầu trong phân chia thứ hai trong khi lệnh đang chạy, bạn vẫn có thể nhận được một số hiển thị. Nhưng đối với 99,99% thời gian nó đẹp hơn nhiều)

Giải thích: $(ps axho uid [...] | wc -L) tính toán độ dài tên người dùng tối đa của quá trình chạy CURRENTLY và sau đó chúng tôi thực thi ps bình thường với chiều dài của tên người dùng

Ngoài ra, nếu bạn muốn trông giống như bình thường đối với tên người dùng ngắn (< = 8 ký tự) và không tâm trí cho một vài tên người dùng dài ở đầu ra không được căn chỉnh với tiêu đề, bạn có thể làm điều gì đó như:

ps ax-người dùng: 40, pid, ppid, c, stime, tname, time, cmd | perl -pe 'if (/^(\ S +)/và chiều dài $ 1> 8) {s/^ (\ S +) \ s +/$ 1 /} khác {s/^ (. {9}) \ s +/$ 1 /} '

gì mà không là làm cho cột tên truy nhập đầu ra rất dài (-o user:40), và sau đó postprocesses đầu ra tên người dùng quá lâu (length $1 > 8) chỉ có một khoảng cách giữa họ và cột tiếp theo, và tên người dùng ngắn (else {) đều được tỉa trở về mặc định (tối đa 8 ký tự, và số còn lại tối đa 9 ký tự là dấu cách)