更改Linux中的进程名称
我在 Linux 上,正在从我的 C 生成应用程序中派生/执行一个新进程。是否也可以更改这些新子进程的命名?
我希望能够识别正在启动的进程,以防出现问题并且需要手动终止它。目前他们都有相同的名字。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
我在 Linux 上,正在从我的 C 生成应用程序中派生/执行一个新进程。是否也可以更改这些新子进程的命名?
我希望能够识别正在启动的进程,以防出现问题并且需要手动终止它。目前他们都有相同的名字。
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(5)
我认为这应该可行,为了说明原理......
将更改名称,并用“A”代替第一个字母。按 CtrlZ 暂停,然后运行
ps
查看名称更改。我不知道,但这似乎有些危险,因为有些事情可能取决于 argv[0] 。另外,我尝试将指针本身替换为另一个字符串;没有雪茄。因此,这只适用于
strcpy
以及短于或等于原始名称的字符串。可能有也可能没有更好的方法。我不知道。
编辑:非字面解决方案:如果您要分叉,您知道子级的 PID(子级中的
getpid()
,父级中的fork()
的结果)。只需将其输出到您可以读取的地方,然后通过PID杀死孩子即可。另一个非文字解决方案:使用另一个名称(
ln -s a.out Kill_this_a.out
)创建到可执行文件的软链接,然后当您执行时,执行该链接。该名称将是链接的名称。I think this should work, to illustrate the principle...
will change the name, and put an "A" instead of the first letter. CtrlZ to pause, then run
ps
to see the name changed. I have no clue, but it seems somewhat dangerous, since some things might depend onargv[0]
.Also, I tried replacing the pointer itself to another string; no cigar. So this would only work with
strcpy
and strings shorter or equal than the original name.There might or might not be a better way for this. I don't know.
EDIT: nonliteral solution: If you're forking, you know the child's PID (
getpid()
in the child, result offork()
in the parent). Just output it somewhere where you can read it, and kill the child by PID.another nonliteral solution: make softlinks to the executable with another name (
ln -s a.out kill_this_a.out
), then when you exec, exec the link. The name will be the link's name.其中一条评论提到了 prctl,但这确实值得拥有自己的答案,因为设置 argv[0] 并非在所有情况下都有效(它在我的系统上没有任何作用)。
在 Linux 中,至少有两个库调用可以设置线程的名称,两者都限制为 15 个字符加上终止
NUL
字节:pthread_setname_np(...) 其中
np
代表“不可移植”,但这可能存在于其他一些操作系统上:https://linux.die.net/man/3/pthread_setname_npprctl(PR_SET_NAME...)
也是不可移植的: https://linux.die.net/man/2/prctl示例
这是一个测试不同方法(没有错误处理):
请注意
argv[0]
之后缺少输出:在野外
这是生产代码中的示例(与往常一样,在 GitHub 上查看代码时请务必记下许可证)
请参阅另
请参阅以下问题和解答:
One of the comments mentions
prctl
, but this really deserves its own answer, because settingargv[0]
will not work in all cases (it does nothing on my system).There are at least two library calls to set the name of a thread in Linux, both limited to 15 characters plus the terminating
NUL
byte:pthread_setname_np(...)
where thenp
stands for "non-portable", but this might be present on some other OSes: https://linux.die.net/man/3/pthread_setname_npprctl(PR_SET_NAME...)
which is also non-portable: https://linux.die.net/man/2/prctlExample
Here's a test of the different methods (with no error handling):
Notice the lack of output after
argv[0]
:In the wild
Here's an example in production code (as always, be sure to take note of the license when looking at code on GitHub)
See also
See also these questions and answers:
根据此评论,
prctl(PR_SET_NAME)
只影响线程的“短名称”。与写入/proc/self/comm
效果相同。要更改“长名称”(
/proc/self/cmdline
,它实际上由htop
和ps u
使用),您需要一些丑陋的 hack (该评论中提到了这一点,但链接已失效)。这种黑客攻击的示例可以在 Chromium 源代码中找到: https://source.chromium.org/chromium/chromium/src/+/master:content/common/set_process_title_linux.ccAccording to this comment,
prctl(PR_SET_NAME)
only affects the "short name" of a thread. It has the same effect as writing into/proc/self/comm
.To change the "long name" (
/proc/self/cmdline
which is actually used byhtop
andps u
) you need some ugly hack (which is mentioned in that comment but the link is dead). An example of this kind of hack can be found in Chromium source code: https://source.chromium.org/chromium/chromium/src/+/master:content/common/set_process_title_linux.cc这是一个不可移植的黑客:
This is a non-portable hack:
下面的代码示例会将进程的名称更改为“测试”。
上述程序的输出为:
./a.out
Argv[0] --> ./a.out
Argv[0] -->测试
argv[0] 包含进程的名称。
The below code sample would change the name of the process to "Testing".
The output of above program is:
./a.out
Argv[0] --> ./a.out
Argv[0] --> Testing
The argv[0] contains the name of the process.