有没有办法在Solaris中生成完整的进程列表,而不被截断行?我已经尝试过该ps
命令,并带有以下参数:
-f 生成完整列表。 (见下文 完整列表中各列的重要性 - 英。)
-l 生成一个长列表。 (见下文。)
所以,这两者似乎都做了我想要的事情,但是,在 ps 手册页的更下方,我发现了这一点:
args 该命令及其所有参数作为 细绳。实现可能会被截断 该值对应于字段宽度;这是 取决于实现是否有 发生进一步截断。这是 未指定是否为字符串 表示的是参数的一个版本 传递给命令时的列表 当它开始时,或者是一个版本 参数可能已被修改 通过应用程序。应用程序不能 取决于能否修改它们 参数列表并进行修改 化反映在 ps 的输出中。 Solaris 实现限制 字符串为 80 字节;该字符串是 参数列表的版本原样 启动时传递给命令。
这基本上意味着输出将被截断,而我对此无能为力。所以,我来这里。当然其他人也遇到过这个问题,甚至可能有解决方法。我猜 ps 无法做到这一点,所以我需要使用其他工具来做到这一点。准确吗?
答案1
你可以尝试
pargs <PID>
这给你所有参数的列表
或者使用其他ps。如果以 root 身份运行(或任何具有足够权限的用户)
/usr/ucb/ps auxww
会给你所有的论据。它是 SUNWscpu 的一部分,“源兼容性,(Usr)”
答案2
内核不需要跟踪命令行参数。当程序通过调用启动时,内核必须将参数复制到进程内存中(以便它们像在 C 程序中execve
一样可用)。argv
之后,内核可以丢弃用于存储初始命令行参数的内存。允许进程覆盖其参数副本。所以可能根本就没有争论的痕迹。
某些 UNIX 变体确实以某种形式保留参数的副本。 Solaris 以/proc/$pid
.从 OpenSolaris 2009.06 开始,参数的唯一踪迹是在 中/proc/$pid/psinfo
,它们之间用空格连接(因此您无法区分foo "one" "two"
和foo "one two"
),并且生成的字符串被截断为 80 字节。该字段/proc/$pid/psinfo
是列ps
中打印的内容args
。
顺便说一下,-f
和-l
选项控制打印哪些字段,而不是控制字段是否被截断到某个宽度。
答案3
ps -e
给出所有正在运行的进程的列表。还有这个ps -elf
。
答案4
根据ps
您使用的命令,我使用
ps -auxw