1

在基于 linux(基于 unix)的系统中,所有进程都有所谓的cmdline. 可以在过程的生命周期内更改它吗?例如,cmdline使用一些进度/调试信息进行修改。
使用流程是否有任何限制/约定cmdline

我为什么要问?在 out 项目中,为了监控特定的子系统,我们广泛使用cmdline对工人进行修改的方法。为了阅读cmdlines,我们使用 python 库 psutil。但是从某些版本开始,此实用程序开始缓存cmdline进程。我已经创建了关于它的错误,但其中一位作者声称,cmdline在进程的生命周期内不应更改(链接到错误

有什么建议么?

谢谢。

在更改下更新cmdline我不考虑更改进程的 exec 参数。我正在更改 proctitle (http://www.unix.com/man-page/FreeBSD/3/setproctitle/)

4

3 回答 3

1

只有一种情况我会重命名命令的进程,在这种情况下,您使用 #!'d 子进程运行脚本,这使得使用 killall 很难快速找到它。

一个例子是运行一个名为 'foobar that's #!' 的 Python 脚本:

#!/usr/bin/python

...

这将在 ps 中显示为

   0 18852 18810   0  1:09AM ttys006    0:03.50 /usr/bin/python -B ./foobar

在这种情况下,重命名进程是有益的,因为它将与执行者的期望相匹配,如果事情变得疯狂,您可以快速发出 killall 而无需拿出放大镜。当我想让一个进程死掉时,我想让它死掉。

但是,在重命名线程的情况下呢?我用 celeryd 遇到了这个问题,发现它是无缘无故的,而且是不必要的“聪明”。我建议反对它。找到线程状态有用的论点是没有实际意义的,因为枚举进程和窥视每个人的 proc 结构以提取一点状态信息的成本比仅将其记录到 syslog 或 stdout/err 的成本要高得多。

如果您在 Linux 上并通过 /proc 文件系统进行枚举,我想它会更加昂贵。

您不应该更改它的论点,因为您“丢失”了有关程序如何启动的信息。我真的不同意这一点,因为至少对于 Linux,/proc//cmdline 默认限制为 4096我相信 - 进程参数的最大长度是 1024*1024 字节。(想想:ls -l /dir/with/100_thousand_files/*)

因此,您并不能真正保证拥有“真正的”命令行,也不应该期望它在那里。

于 2012-09-25T08:14:29.677 回答
0

我必须同意声称不应该改变它的人。命令行是程序的调用者作为参数提供给您的。你是不明智的。

如果您想为您的子进程提供不同的命令行参数,那么您可以“执行”它们。我不确定这是否是您所说的“工人”,您的问题在这个概念上有点模糊。

如果您(详细)解释您的需求是什么,而不是您如何尝试实现该需求,也许它可能会有所帮助。

于 2012-09-25T08:04:14.950 回答
0

进程唯一不变的是进程 ID。除此之外,任何事情都可以改变。例如,如果进程执行exec系统调用,代码和数据段会发生变化,命令行也会发生变化。

所有缓存系统都提高了速度,但某些数据必须实时更改,并且包括缓存在内的系统逻辑必须迎合它。

于 2012-09-25T10:41:55.657 回答