介绍
安全命令可能在有效工作停滞后仍继续运行。停止进程前,你需要识别正确进程,并了解哪些其他活动必须保持可用。
本实验提供无害的练习工作进程和应用日志。你将查看进程身份、管理终端作业、停止一个指定工作进程,并提取其诊断信息,整个过程不会触及平台服务。
查看进程并管理终端作业
本步骤中,你将查看运行中的进程,并比较终端中的前台与后台工作。
进入 Kali,并选择共享工作区:
kali
cd /home/labex/project
进程是运行中的程序,拥有进程 ID(PID)和所有者。ps 打印快照。-e 选项选择全部进程,-o 选择要显示的字段:
ps -eo pid,user,args
找到预置的 Python 练习工作进程及其所有者 kali。忽略无关的平台和容器进程。
top 通常持续刷新。-b 选择可打印的批处理视图,-n 1 则限制为一次更新:
top -b -n 1
它显示资源快照,而不会让你停留在交互界面中。PID 和资源数值可能不同。
前台命令会占据终端,直到执行结束。sleep 等待指定秒数,不产生输出。开始一段有意设置的较长等待:
sleep 30
按 Ctrl+C 中断该前台命令并返回提示符。需要停止当前占据终端的命令时,Ctrl+C 很有用。
末尾的 & 在后台启动命令,让 shell 立即接受更多命令。启动一个可随时终止的定时等待:
sleep 300 &
shell 打印作业号(例如 [1])和 PID。jobs -l 列出属于当前 shell 的后台作业及其 PID:
jobs -l
你应该看到 sleep 300 作业正在运行。保持它运行,以供本步骤检查。保留同一终端,继续下一步;作业号属于当前 shell 会话。
只停止停滞进程并读取日志
本步骤中,你将停止指定练习进程,保留另一个工作进程,并保存相关错误行。
在同一个 Kali shell 中,停止用于练习的后台定时等待。kill 发送信号;默认终止信号请求进程退出。%1 作业引用指向这个全新 shell 中创建的第一个作业:
kill %1
shell 可能打印终止通知。对于并非作为当前 shell 作业启动的进程,应先识别其 PID。pgrep -a 打印匹配项的 PID 和完整命令行;-f 根据完整命令行匹配:
pgrep -af stalled-worker.py
相关命令是 python3 /opt/labex/stalled-worker.py。这是一个无限等待的无害训练工作进程。另一个 training-heartbeat.py 工作进程必须保持运行。
你可以用命令替换将找到的 PID 传给 kill。$(...) 运行内部命令并替换为其输出;双引号将输出保留为一个参数。^ 和 $ 锚点匹配完整的预期命令,避免使用范围更广的部分名称。只停止这个确切工作进程:
kill "$(pgrep -f '^python3 /opt/labex/stalled-worker.py$')"
只执行一次;工作进程退出后再执行,将找不到 PID。命令应直接返回,不产生输出。确认需要保留的工作进程仍存在:
pgrep -af training-heartbeat.py
PID 可能不同,但命令路径仍应列出。
应用日志以文本记录事件。提供的练习日志为 worker.log;本练习无需 systemd 或内核日志访问权限。读取日志:
cat /home/labex/project/worker.log
日志混合了信息消息与描述停滞操作的 ERROR 行。使用之前介绍的过滤与重定向,仅保存错误记录:
grep '^ERROR ' /home/labex/project/worker.log > /home/labex/project/worker-errors.txt
cat /home/labex/project/worker-errors.txt
预期输出:
ERROR training request exceeded its time limit
你停止了指定工作进程,保留了无关工作进程,并将诊断信息与完整日志分开保存。
总结
你查看了进程 ID、所有者与命令行,观察了前台中断和后台作业,发送了针对性的终止信号,并过滤了应用日志。在停止选定的停滞进程时,你保留了无关工作进程。



