我喜欢这个图案ps aux | grep something
。
这样我就可以轻松找到所需的信息,而无需记住命令的命令行选项ps
。
不幸的是,ps 命令将 Linux 用户名(第一列)截断为 7 个字符后,+
如果用户名较长,则添加 a。
就我而言,这很重要,因为用户名类似于“foobar_123”和“foobar_234”。
我知道我可以使用以下命令,但如果我仍然可以使用该模式,那就太好了ps aux | grep something
。
ps ax o user:16,pid,pcpu,pmem,vsz,rss,stat,start_time,time,cmd
如何通过配置获得上述格式,以便ps aux | grep something
不删除用户名?
提示:诸如“use ps ...special...args...”之类的答案与上述问题不匹配。
版本:procps-ng 版本 3.3.5
答案1
如果您知道带有多个选项的长命令可以满足您的要求,但您不想每次都键入它,那么(假设您使用的是 Bash)您可以创建一个别名使该命令变得更容易。例如:
alias ps_mod='ps ax o user:16,pid,pcpu,pmem,vsz,rss,stat,start_time,time,cmd'
然后你只需输入这个简单的命令即可。您可以将此行添加到 ~/.bash_profile (或 ~/.bashrc,具体取决于您的系统)文件中,以便在登录时自动定义它。
如果您不使用 Bash,那么您可能可以通过定义 shell 函数来执行类似的操作。
答案2
小补丁procps-ng 源
似乎对源代码进行快速修补就可以解决问题;通常,用户列设置为 8,并将按如下详述进行截断。
补丁适用于标记为 v3.3.5 的提交 64fa8898(上面链接)
如果你要编译它,你最好下载最新的源代码 - 我建议下载最新的源代码并将 procps-ng 源文件中的“USER”行ps/output.c
从 8 编辑到 16,如下所示,而不是修补旧的(2013 年左右)版本:
---
ps/output.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/ps/output.c b/ps/output.c
index 9644ed3..41c2eda 100644
--- a/ps/output.c
+++ b/ps/output.c
@@ -1564,7 +1564,7 @@ static const format_struct format_array[] = {
{"uname", "USER", pr_euser, sr_euser, 8, USR, DEC, ET|USER}, /* man page misspelling of user? */
{"upr", "UPR", pr_nop, sr_nop, 3, 0, BSD, TO|RIGHT}, /*usrpri*/
{"uprocp", "UPROCP", pr_nop, sr_nop, 8, 0, BSD, AN|RIGHT},
-{"user", "USER", pr_euser, sr_euser, 8, USR, U98, ET|USER}, /* BSD n forces this to UID */
+{"user", "USER", pr_euser, sr_euser, 16, USR, U98, ET|USER}, /* BSD n forces this to UID */
{"usertime", "USER", pr_nop, sr_nop, 4, 0, DEC, ET|RIGHT},
{"usrpri", "UPR", pr_nop, sr_nop, 3, 0, DEC, TO|RIGHT}, /*upr*/
{"util", "C", pr_c, sr_pcpu, 2, 0, SGI, ET|RIGHT}, // not sure about "C"
--
附录
根据消息来源ps
:
// 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. However, we will now truncate such names
// and provide a visual hint of such truncation. Hopefully, this will reduce
// the volume of bug reports regarding that former 'feature'.
//
// 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
//
答案3
这个问题是 2014 年在 askubuntu.com 论坛上提出的
我的解决方案受到上述链接的启发,但具有一些可移植性。将此函数添加到您的 .bashrc 中并继续使用它!
ps() {
if [[ $@ =~ .u* || *u ]]; then
command getent passwd |\
awk -F':' ' \
!len || length($1) > len {len=length($1);s=$1}\
END{print s, len; system("ps axo user:"len",pid,pcpu,pmem,vsz,rss,tty,stat,start,time,comm");}'
else
command ps "$@"
fi
}
ps aux | grep someshit
像平常一样,将上述函数添加到您的 ~/.bashrc 中,并享受格式化为最大可能用户名的输出,该用户名是使用 getent 从 /etc/passwd 以友好的常规用户方式确定的 - 然后通过 awk 进行解析bash 帮助保存与最长用户名字符串相关的整数值。
现在当我
$ ps axu | grep this
或者
$ ps uaz | grep this
或者
$ ps aux | grep this
输出:
thisisareallylonguser 9289 0.0 0.0 23192 4716 pts/6 S 17:59:54 00:00:00 bash
如果您希望我单步执行 bash 函数(如果不清楚),请告诉我。