【问题标题】:Change real process name in C on Linux在 Linux 上更改 C 中的真实进程名称
【发布时间】:2015-07-31 13:21:48
【问题描述】:

我目前正在尝试更改进程的进程名称,以便我可以使用 htop、top、...更轻松地阅读。我想 LD_PRELOAD 将此代码放入另一个进程中,以便它被环境重命名变量。

我在互联网上找到了很多东西,但没有任何效果:

prctl(PR_SET_NAME, "Test");

这不起作用,因为 htop 不尊重该名称。

Nginx setproctitle (Link) 也不能正常工作,因为它会剥离参数(进程需要的参数)。

我尝试了所有我发现的东西,但现在我没有想法了。

这在 linux 中是否可行?怎么做?

【问题讨论】:

  • 你确定需要用 C 代码解决这个问题吗?
  • 如果它可以生成可以预加载的 .so 文件,我会使用任何其他语言。
  • 原来的问题是如何更改进程的名称?第一个解决方案是编写一个 .so LD_PRELOAD 来实现这一点?如果我正确理解了您的 systemd 设置,可能会有一个更简单的解决方案,首先不需要 .so 或 LD_PRELOAD。

标签: c linux process


【解决方案1】:

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

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

或 C/C++:

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

【讨论】:

  • 问题是关于c++ 而不是bash 或运行。
  • 没错,但感觉像是 X-Y 问题。让我们问!
  • @VictorPolevoy 我相信 OP 想用 C 来解决这个问题,因为他不知道 shell 有更简单的解决方案。无论如何,C/C++ 代码非常相似,我添加了该示例。
  • @das_j 创建单元文件的副本并通过 systemd 调用它,而不是通过 package 部署的那个
  • 在顶部它仍然显示实际的进程名称而不是fancy_name
【解决方案2】:
#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
    ;
}

【讨论】:

    猜你喜欢
    • 2011-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-06
    • 1970-01-01
    • 1970-01-01
    • 2015-07-24
    • 1970-01-01
    相关资源
    最近更新 更多