如何在没有截断行的情况下在solaris中获得完整的进程列表?

gab*_*be. 60 process solaris ps

有没有办法在solaris中生成完整的进程列表,而不会被截断?我试过ps命令,有以下参数:

  -f 生成完整列表。(见下文
                      完整列表中列的重要性-
                      ing。)
  -l 生成一个长列表。(见下文。)

所以,那些似乎都在做我想做的事,但是,在 ps 手册页的更深处,我发现:

 
 args 命令及其所有参数作为
                         细绳。实现可能会截断
                         这个值到字段宽度;这是
                         依赖于实现的是否有
                         发生进一步截断。这是
                         未指定是否为字符串
                         表示的是参数的一个版本
                         列表,因为它被传递给命令
                         当它开始时,或者是
                         参数,因为它们可能已被修改
                         通过应用程序。应用程序不能
                         取决于能够修改他们的
                         参数列表并进行修改
                         将反映在 ps 的输出中。
                         Solaris 实现限制了
                         字符串到 80 个字节;字符串是
                         参数列表的版本
                         开始时传递给命令。

这基本上是说输出将被截断,我对此无能为力。所以,我来了。当然,其他人也遇到过这个问题,甚至可能有办法解决它。我猜 ps 做不到,所以我需要使用其他工具来做到这一点。那是准确的吗?

Mar*_*l G 66

你可以试试

pargs <PID>
Run Code Online (Sandbox Code Playgroud)

这为您提供了所有参数的列表

或者使用其他ps。如果以 root 身份运行(或任何具有足够权限的用户)

/usr/ucb/ps auxww
Run Code Online (Sandbox Code Playgroud)

会给你所有的论据。它是 SUNWscpu 的一部分,“Source Compatibility, (Usr)”

  • 在 Solaris 11 上,如果您使用不带破折号的选项(如“/usr/bin/ps auxwww”),它们将被视为 UCB 样式选项,并且即使您不是以 root 身份运行,输出也会显示超长的行。这没有得到很好的宣传。另见:http://superuser.com/questions/148271/ps-command-in-solaris (3认同)

Gil*_*il' 14

内核不需要跟踪命令行参数。当程序通过execve调用启动时,内核必须将参数复制到进程内存中(例如,这样它们就可以像argv在 C 程序中一样使用)。之后,内核可以丢弃用于存储初始命令行参数的内存。允许进程覆盖其参数副本。所以可能根本就没有争论的痕迹。

一些 unix 变体确实以某种形式保留了参数的副本。Solaris 在/proc/$pid. 从 OpenSolaris 2009.06 开始,参数的唯一痕迹是 in /proc/$pid/psinfo,它们之间用空格连接(因此您无法区分foo "one" "two"foo "one two"),并且生成的字符串被截断为 80 个字节。这个字段/proc/$pid/psinfo是列中ps打印的内容args

顺便说一下,-f-l选项控制打印哪些字段,而不是字段是否被截断到某个宽度。

  • 所以,我们在 2013 年再次坐在这里,我们仍然将字符串截断为 80 个字节,因为我们在 1970 年代只有 80 个字符的终端,并且“一些”程序尚未理解生活已经向前发展的事实。而我们喜欢它,我们称赞它为“兼容性”!我们应该为自己感到羞耻... (6认同)