是否可以从进程外部重命名您拥有的进程?

是否可以从进程外部重命名您拥有的进程?

如果我以 $USER 身份登录,并且运行 top 并且可以看到我拥有的进程,我可以重命名该进程吗?

如果是这样,怎么办?如果不是,root 可以重命名外部进程吗?如果是这样,怎么办?如果没有,为什么?

答案1

这取决于您所说的“重命名”是什么意思。进程没有这样的名称。进程有一个命令行。程序启动后无需保留命令行。所有 Unix 变体都保留命令行的副本,但它可能会被截断或以其他方式修改(例如,将参数与中间的空格一起运行,因此与foo 'hello world'无法区分foo hello world)。

大多数 Unix 变体允许进程通过修改函数参数的内容来修改显示的命令ps行。您只能就地覆盖缓冲区,因此可能无法使缓冲区更长,但始终可以使其更短(每个参数以第一个空字节结束)。argvmain

从进程外部,您可以运行调试器并编辑程序的argv.下面是Linux下使用GDB的演示。

$ sleep 999999.00000000000000000000000000000000000000000000000 &
[1] 2131
$ ps 2131
  PID TTY      STAT   TIME COMMAND
 2131 pts/8    S      0:00 sleep 999999.0000000000000000000000000000000000000000
$ gdb -pid 2131
(gdb) bt
#0  0x00007fa1206286e0 in __nanosleep_nocancel ()
    at ../sysdeps/unix/syscall-template.S:81
#1  0x0000000000403f3f in ?? ()
#2  0x0000000000403d58 in ?? ()
#3  0x00000000004016c9 in ?? ()
#4  0x00007fa120592b45 in __libc_start_main (main=0x401540, argc=2, 
    argv=0x7fffc8b1bf18, init=<optimized out>, fini=<optimized out>, 
    rtld_fini=<optimized out>, stack_end=0x7fffc8b1bf08) at libc-start.c:287
#5  0x00000000004017d5 in ?? ()
(gdb) frame 4
#4  0x00007fa120592b45 in __libc_start_main (main=0x401540, argc=2, 
    argv=0x7fffc8b1bf18, init=<optimized out>, fini=<optimized out>, 
    rtld_fini=<optimized out>, stack_end=0x7fffc8b1bf08) at libc-start.c:287
(gdb) p argv
$1 = (char **) 0x7fffc8b1bf18
(gdb) p argv[0]
$2 = 0x7fffc8b1d27e "sleep"
(gdb) p argv[1]
$3 = 0x7fffc8b1d284 "999999.", '0' <repeats 47 times>
(gdb) argv[1][9] = 'z'
Undefined command: "argv".  Try "help".
(gdb) p argv[1]
$4 = 0x7fffc8b1d284 "999999.00z", '0' <repeats 44 times>
(gdb) detach
Detaching from program: /bin/sleep, process 2131
(gdb) quit
$ ps 2131
  PID TTY      STAT   TIME COMMAND
 2131 pts/8    t      0:00 sleep 999999.00z0000000000000000000000000000000000000

根据系统的配置方式,您可能能够也可能无法在不是由调试器启动的程序上运行调试器,并且您将无法在不是以以下方式运行的程序上运行调试器:您的用户没有额外的权限(除了以 root 身份运行调试器)。这是通过使用系统调用的权限来控制的ptrace

相关内容