在Linux上用C语言更改真实进程名称

6

我目前正在尝试更改进程的进程名,以便我可以在htop、top等工具中更轻松地阅读。我想将这段代码使用LD_PRELOAD注入到另一个进程中,以便它通过环境变量重命名。

我在网上找了很多资料,但都没有用:

prctl(PR_SET_NAME, "Test");

这不起作用是因为htop没有遵守名称。

Nginx的setproctitle (链接)也不能工作,因为它剥夺了进程所需的参数。

我尝试了所有我能找到的方法,现在我已经没有了想法。

在Linux中有可能吗?怎么做?


你确定需要使用C代码来解决这个问题吗? - Useless
如果有其他语言能够生成可以预加载的.so文件,我愿意使用它们。 - das_j
那么最初的问题是如何更改进程的名称?第一个解决方案是编写.so LD_PRELOAD来实现这一点吗?如果我正确理解了您的systemd设置,可能有一个更简单的解决方案,根本不需要.so或LD_PRELOAD。 - Useless
2个回答

12

通过 shell 脚本或使用 exec 运行您的程序,并将所需的名称作为 argv [0] 传递:

#/bin/bash
exec -a fancy_name a.out ...

或者 C/C++:

execl( "./a.out", "fancy_name", ... );

1
问题是关于 c++ 而不是 bash 或运行。 - Victor Polevoy
@VictorPolevoy 我相信OP想要用C来解决这个问题,因为他不知道有更简单的shell解决方案。无论如何,C/C++代码可以非常相似地完成,我添加了那个示例。 - Slava
1
@das_j 创建一个unit文件的副本,并通过systemd调用它,而不是使用软件包部署的那个。 - Slava
@Slava 很难。尝试使用 ( exec sleep hurz 120; )( exec -a hurz sleep 120; ),然后使用 ps aux|grep hurz 查找进程。 - ex-bart
1
在顶部仍然显示实际进程名称而不是fancy_name。 - Shoaib Khan
显示剩余3条评论

7
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#define NEW_NAME "hello_world"
int main(int argc, char **argv) {
  if(strcmp(argv[0], NEW_NAME)) {
    argv[0] = NEW_NAME;
    execv("/proc/self/exe", argv);
    fputs("exec failed", stderr); 
    return 1;
  }
  while(1) // so it goes to the top
    ;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接