我正在开发一个现有的基于 Linux 的脚本,其中包含以下内容
pid=`jps | grep TestServer | awk '{print $1}'`
kill -9 $pid
我知道这将终止名为“TestServer”的进程
我是 Linux 新手,正在尝试理解该脚本,所以如果这是一个愚蠢的问题,请原谅。
请告诉我 谁负责设置进程名称“TestServer”
答案1
A过程没有任何名字。它有一个(正)唯一数字,称为其进程号(进程 ID)。
几乎所有进程都是从其父进程启动的叉系统调用记录在叉(2)手册页(有时,vfork(2)可以使用)。派生进程几乎与其父进程相同(它执行相同的二进制文件)。要执行新程序,执行(2)syscall 在某些进程内部使用。
但是,进程确实会执行某个程序,该程序确实有名称(因为它存在于文件系统中)。您可以通过以下链接了解有关进程的更多信息:进程(5)伪文件系统。当然,多个进程可以执行同一个程序。您可以尝试ls -l /proc/self/
列出与您的进程(执行该ls
命令的进程)相关的伪文件。您可能会觉得很有趣cat /proc/self/maps
。并/proc/1234/
告诉您有关 pid 1234 的进程的信息。
pkill
、、实用pgrep
程序pidof
正在使用/proc
。
我建议你读一本关于高级Unix编程-在纸面上-以及高级Linux编程-在网上-;另请阅读系统调用(2),还有有关系统调用的维基页面。
您的脚本不适合直接使用kill -9
。它应该先尝试kill -TERM
然后kill -QUIT
(让程序正常终止,例如清理临时文件等...)然后才尝试最后kill -KILL
(即kill -9
)。您可以阅读杀死(2)手册页(以及信号(7)请参阅手册页。
附加物
(2014 年 7 月新增)
在 Linux 上,你可以使用 Linux 特定的pthread_setname_np(3)设置线程(不是进程)短名称的函数
答案2
该名称来自为程序指定的名称。因此,无论包含可执行文件的文件名称是什么。如果文件名为 fred,则进程名称将为 fred。
通过名称终止进程的更好方法是使用 pkill。
pkill TestServer