Windows 的进程信息与 Linux 类似,也有进程ID,父子进程的概念,命令行下结束进程使用 taskkill 命令。
与 Linux 相对应,在 Linux 下查看进程信息使用 ps,杀进程使用 kill,Windows 下查看进程列表使用命令 tasklist,杀进程使用 taskkill。
在 Windows 下有三种方式杀掉进程:
按进程ID
按可执行文件名称
按窗口信息
进程ID比较直观,通过 tasklist 可以查到进程ID
通过 taskkill 指定进程ID,杀掉进程
taskkill pid 24044
如果进程有子进程,可以通过加参数 t 连带杀掉子进程。在 cmd 中使用 start i notepad 可以起一下子进程。父子进程信息在 sysinternal 工具包中的 Process Explorer 中看的比较清楚。工具的可执行文件名叫 procexp.exe 可以到微软官网下载。
汇总一下,在命令行下启动子进程的命令为
c:\>start i notepad
c:\>start /i cmd
杀掉进程以及子进程的子进程,命令行为:
taskkill f pid 18948 t
如果需要将进程ID传给变量,可以通过文件的形式给变量传参
rem bat脚本,传参演示
rem 先清空变量
set MYPID=
rem 通过文件重定向给变量传参
set /P MYPID=<c:\pid.log
rem 检查变量内容
env| findstr "MYPID"
rem 通过进程ID杀进程
taskkill F PID %MYPID% T
通过进程ID杀进程,难点在于定位进程ID。通过可执行文件名杀进程比较简单。比如杀掉写字板程序,/f 是强制杀掉,/im 指定可执行文件名。
taskkill f im "notepad.exe"
最后一个用的比较少,主要用于桌面上有多个 cmd 窗口的情况。在 tasklist v 命令中可以查看到进程的窗口信息。
其中最后一列就是窗口信息,cmd 下可以通过 title 命令设置窗口信息。
title test
通过窗口信息,可以从大量 cmd 进程中区分出不同的进程。比如命令
tasklist fi "IMAGENAME eq cmd.exe" v
刚才我们设置的 test 标题的窗口就在里面
通过 指定 filter 可以定位指定 cmd 程序
taskkill 和 tasklist 都可以指定过滤器,这样就可以通过过滤器杀进程了
最后补充一点,start /b 是在同窗口起进程,start /i 是在新窗口起进程,新的窗口有新的变量,不会传递变量。cmd /c 和 cmd /k 与start功能类似。
在自动化运维中避免不了和Windows命令行打交道,其中也会涉及到进程重启,在命令行调bat脚本或调用python 脚本。而脚本的启动器就是 cmd 程序和 start 命令。
附 cmd 和 start 帮助信息
cmd命令 帮助文档
c:\>cmd /?
启动 Windows 命令解释器的一个新实例
CMD [/A | /U] [/Q] [/D] [/E:ON | /E:OFF] [/F:ON | /F:OFF] [/V:ON | /V:OFF]
[[/S] [/C | /K] string]
/C 执行字符串指定的命令然后终止
/K 执行字符串指定的命令但保留
/Q 关闭回显
start命令 帮助文档
c:\>start /?
启动一个单独的窗口以运行指定的程序或命令。
START ["title"] [/D path] [/I]
[/WAIT] [/B]
[command/program] [parameters]
"title" 在窗口标题栏中显示的标题。
path 启动目录。
B 启动应用程序,但不创建新窗口。
应用程序已忽略 ^C 处理。除非应用程序
启用 ^C 处理,否则 ^Break 是唯一可以中断
该应用程序的方式。
I 新的环境将是传递
给 cmd.exe 的原始环境,而不是当前环境。
WAIT 启动应用程序并等待它终止。