web-dev-qa-db-ja.com

実行中のプロセス。ユーザー名の代わりにuid番号を表示するのはなぜですか?

ps -eaf

..

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(DomainUsers)groups = 513(DomainUsers)

LDAPのすべてのユーザー(/etc/nsswitch.confは正しい、すべて正しい-しかし、このユーザーのみが表示されない)

ユーザー名ではなくuid番号(1466)が表示されるのはなぜですか?

25
Anton Shevtsov

ユーザー名をps -ef(POSIX)またはps aux(BSD派生)にリストする場合、8文字の制限があります。 オプションの説明

MacとLinuxの両方のボックスでmanページを検索しましたが、そこに記録されている制限は見つかりませんでした。

質問は、回答として8文字の制限でフォーラムに定期的に表示されます。

didついに偶然に遭遇 このページ ここで、「バグ」はDebianに対して報告されたが、として閉じられなかったバグ。それらは このページ を参照しており、POSIXおよびUNIX標準が名前が長すぎる場合にuidにフォールバックする必要があることについても主張しています。また、実際のP​​OSIX標準からのものではありません。

これが信頼できるものかどうかはわかりませんが、9文字のユーザー名での動作を説明しています。 :)

たぶん他の誰かがより信頼できるリンクへの回答を投稿できますか?

38
Ray Toal

Ray Toalが言及しているように、これは8文字の制限に制限されています。これはバグではなく、Rayが述べたように標準の一部です。 psprocpsパッケージの一部)のソースコードを確認すると、コメントの1つに

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

セクションの link[〜#〜] stdout [〜#〜]を確認すると、フィールド( userrusergroup rgroup)は、取得でき、フィールド幅が許す場合に出力されます。
ユーザーおよびグループ名のフィールド幅が8に制限されている理由は レガシーサポート である可能性がありますが、これは推測にすぎません。

11

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

_-o_オプションは、psコマンドの出力のユーザー定義形式を指定するために使用されます。

指定されたユーザー定義フォーマットは、ユーザー、pid、ppid、stime、tname、time、およびcmdフィールドを出力することを示しています。

_cut -d: -f1 /etc/passwd | wc -L_は、パスワードファイル内の最長ログイン名の文字数を決定します。したがって、user:$(cut -d: -f1 /etc/passwd | wc -L)は、最長のログイン名の最大長を使用してユーザーフィールドを出力するようpsコマンドに指示します。

3
moosaka

Moosakaの答えよりもさらに動的な長さの出力の場合(たとえば、非常に長いユーザー名はほとんどないが、めったに使用されず、ほとんどの場合画面を無駄にしたくない場合)、以下を使用できます。

ps -eo user:$(ps axho uid | sort -u | xargs getent passwd | cut -f1 -d:| wc -L)、pid、ppid、c、stime、tname、time、cmd

ユーザー名列の長さは、現在実行中のプロセスの最長のユーザー名と同じ長さになります。 (ただし、完全なものではないことに注意してください。コマンドの実行中に、ユーザー名が長い新しいプロセスが1秒以内に開始された場合でも、数値が表示されることがあります。ただし、99.99%の時間では、出力がずっと良くなります)

説明:$(ps axho uid [...] | wc -L)は、現在実行中のプロセスの最大ユーザー名長を計算し、その長さのユーザー名で通常のpsを実行します

または、短いユーザー名(<= 8文字)のpsを通常のようにしたい場合、出力内のいくつかの長いユーザー名がヘッダーとずれていることを気にしない場合は、次のようにすることができます。

ps ax -o user:40、pid、ppid、c、stime、tname、time、cmd | Perl -pe 'if(/ ^(\ S +)/ and length $ 1> 8){s/^(\ S +)\ s +/$ 1 /} else {s/^(。{9})\ s +/$ 1 /} 」

それが行うことは、出力ユーザー名列を非常に長くすることです(-o user:40)、その後、出力を非常に長いユーザー名(length $1 > 8)と次の列の間にスペースを1つだけ入れ、短いユーザー名(else {)はデフォルトにトリミングされます(最大8文字のユーザー名、残りの最大9文字はスペースです)。

0
Matija Nalis