在 Linux 中ps
输出:
UID PID PPID C STIME TTY TIME CMD
ps -lu
在 FreeBSD 中,类似但不一样的输出可以通过或命令来实现ps -ju
。后者的问题是很难解析,因为命令可能包含嵌入在输出中间的空格:
UID PID PPID C PRI NI VSZ RSS MWCHAN STAT TT TIME COMMAND USER %CPU %MEM STARTED
或者
USER PID PPID PGID SID JOBC STAT TT TIME COMMAND %CPU %MEM VSZ RSS STARTED
man ps
不是很清楚,但它包含一些可能意味着可以更改输出的信息。谁能解释这是否可能?
答案1
由于您提到由于命令中可能包含空格而导致解析输出的问题ps
,我假设您希望在FreeBSD 上的或输出COMMAND
列右侧的列中包含某些内容。ps -lu
ps -ju
该列右侧的唯一数据也在Linux 上COMMAND
的输出中(不像您所说的那样简单),是命令的开始时间。如果这不是您想要的,请更新您的问题。ps -f
ps
因此,假设您想要命令的开始时间,您可以使用,例如
ps -opid,start,command
...在 FreeBSD 上仅获取PID
、STARTED
和字段。COMMAND
例子:
$ ps -opid,start,command -p $(pgrep -x mosh-server)
PID STARTED COMMAND
1964 13:06 mosh-server new -c 8 -s -l LC_CTYPE=UTF-8
2059 13:08 mosh-server new -c 8 -s -l LC_CTYPE=UTF-8
您显然可以根据需要更改字段的顺序或添加和删除字段。
看手册KEYWORDS
的部分ps(1)
在您的 FreeBSD 系统上获取可用字段的列表。
答案2
-o
是单一 Unix 规范标准选项,ps
可让您准确控制输出哪些字段。
$ /bin/ps -ouid,pid,ppid,lstart,tty,time,args $$
UID PID PPID STARTED TTY TIME COMMAND
1001 40585 40133 Sat 27 May 21:59:32 2023 pts/3 0:00.03 yash -o posix
$
在 FreeBSD 的输出中,记帐命令名称、参数、环境、开始时间和其他几个字段都可以包含空格ps
。事实上,对于ps
基于 Linux 的操作系统上的propcps 来说也是如此。在一般情况下,标准的输出ps
不可被机器解析。它是一种人类可读的格式。
因为我实际上想要机器可解析性,所以我写了一个ps
它的输出是机器可解析。这些字段保证只包含图形字符,并且由一个制表符分隔。这是发送到awk -F'\t'
其他事物的理想选择。具有讽刺意味的是,这使得我可以更轻松地选择我想要查看的进程表的哪些部分,因为可以执行比、和awk
更复杂的过滤器。-A
-a
-x
$ ps -ouid,pid,ppid,stime,tty,time,args -p $$
UID PID PPID STIME TT TIME COMMAND
1001 40585 40133 2023-05-27\04021:59:32\040+0100 pts/3 \0400.031421s yash\040-o\040posix
$
当然,我总是可以通过管道来unvis
获取人类可读的形式,因为这只是 FreeBSD 编码之一vis
。
$ ps -ouid,pid,ppid,stime,tty,time,args -p $$ | unvis
UID PID PPID STIME TT TIME COMMAND
1001 40585 40133 2023-05-27 21:59:32 +0100 pts/3 0.032331s yash -o posix
$
尽管我通常做的是在脚本中循环运行它,通过管道awk
选择通常有趣的进程,然后进入console-flat-table-viewer
.
进一步阅读
ps
。命令。小吃指南。乔纳森·德博因·波拉德。console-flat-table-viewer
。命令。小吃指南。乔纳森·德博因·波拉德。