Linux 中,可以使用
kill
命令停止后台脚本,例如先
Linux 系统中,有时我们可能需要停止正在后台运行的脚本,以下是几种常见的方法来停止后台脚本:
使用 kill
命令
(一)查找后台进程 ID(PID)
- 使用
ps
命令ps
命令可以显示当前系统中的进程信息。ps aux
会列出所有用户的所有进程,在输出结果中,可以通过查看命令列来找到对应的后台脚本进程,后台脚本的命令会显示在最后一列。- 假设我们有一个名为
my_script.sh
的后台脚本在运行,执行ps aux
后可能会看到类似如下的输出:
|USER|PID|%CPU|%MEM|VSZ|RSS|TTY|STAT|START|TIME|COMMAND|
|—|—|—|—|—|—|—|—|—|—|—|
|user|1234|0.1|0.2|5000|1000? Ss 10:00 0:00 /bin/bash /path/to/my_script.sh| - 这里
PID
为1234
的进程就是我们要查找的后台脚本进程。
- 使用
pgrep
命令pgrep
命令可以根据进程名称来查找进程 ID,对于上面提到的my_script.sh
,可以使用pgrep my_script.sh
来获取其 PID,如果脚本是通过其他命令启动的,比如通过bash
启动,也可以使用pgrep bash
来查找可能的后台脚本进程,但这样可能会返回多个 PID,需要进一步筛选。
(二)发送信号停止进程
- 发送
SIGTERM
信号SIGTERM
是一个比较温和的终止信号,它会请求进程正常退出,可以使用kill <PID>
来发送这个信号,对于上面找到的 PID 为1234
的进程,执行kill 1234
,这相当于告诉进程“请正常结束你的任务”,大部分程序会响应这个信号,先完成一些清理工作(如关闭文件、释放资源等)然后退出。
- 发送
SIGKILL
信号- 如果进程对
SIGTERM
信号没有响应(进程处于死循环或者被卡住无法正常退出),可以使用SIGKILL
信号,使用kill -9 <PID>
来发送这个信号。SIGKILL
信号会强制立即终止进程,不会给进程任何清理和保存数据的机会,只有在必要时才使用这个信号,因为它可能会导致数据丢失或系统状态不一致。
- 如果进程对
使用 jobs
和 fg
命令结合
(一)查看后台作业
- 使用
jobs
命令- 当我们在当前 shell 会话中将脚本放到后台运行时,可以使用
jobs
命令来查看后台作业列表,假设我们将一个脚本test_script.sh
放到后台运行,执行jobs
后可能会看到类似如下的输出:[1]+ Running test_script.sh &
- 这里的
[1]
是作业号,Running
表示作业正在运行,test_script.sh
是作业的命令。
- 当我们在当前 shell 会话中将脚本放到后台运行时,可以使用
(二)将后台作业提到前台并停止
- 使用
fg
命令- 可以使用
fg <作业号>
将后台作业提到前台,对于上面的作业,执行fg 1
,脚本会在前台继续运行,我们可以使用Ctrl + C
来中断脚本的执行。Ctrl + C
会发送SIGINT
信号给进程,大多数程序会响应这个信号并退出。
- 可以使用
通过脚本本身的机制停止
(一)在脚本中添加信号处理
- 捕捉终止信号
- 在编写脚本时,可以添加信号处理逻辑,使用
trap
命令来捕捉SIGTERM
或SIGINT
信号,以下是一个简单示例脚本:#!/bin/bash
- 在编写脚本时,可以添加信号处理逻辑,使用
trap “echo ‘Script is being stopped’; exit” SIGTERM SIGINT
while true; do
echo “Script is running”
sleep 1
done
在这个脚本中,当收到 `SIGTERM` 或 `SIGINT` 信号时,会执行 `echo 'Script is being stopped'` 然后退出脚本,这样,当我们在外部使用 `kill` 命令发送信号时,脚本可以优雅地停止。
2. **使用标志文件或变量**
可以在脚本中使用一个标志文件或变量来控制脚本的运行,在脚本开始时创建一个标志文件 `running_flag`,脚本在每次循环时检查这个文件是否存在,在另一个终端或脚本中,删除这个标志文件来通知脚本停止,以下是一个简单的示例:
```bash
#!/bin/bash
# 创建标志文件
touch running_flag
trap "rm -f running_flag; echo 'Script is being stopped'; exit" SIGTERM SIGINT
while [ -e running_flag ]; do
echo "Script is running"
sleep 1
done
- 当我们删除
running_flag
文件时,脚本会检测到并退出,可以通过kill
命令发送信号来触发脚本中的清理逻辑,包括删除标志文件。
使用 pkill
命令(根据进程名批量杀死)
(一)基本用法
- 按进程名杀死
pkill
命令可以根据进程名来杀死进程,如果我们有多个名为my_script.sh
的后台脚本在运行,并且想要全部停止,可以使用pkill my_script.sh
,这会向所有名为my_script.sh
的进程发送SIGTERM
信号,如果想要强制杀死,可以使用pkill -9 my_script.sh
。
- 结合通配符使用
pkill
支持通配符,如果我们有一组类似的脚本,如script1.sh
、script2.sh
等,可以使用pkill 'script*.sh'
来杀死它们,这在一些情况下非常方便,比如当我们知道后台脚本的文件名前缀或后缀时。
下面是关于如何在 Linux 中停止后台脚本的相关问答 FAQs:
问题 1:如果我不知道后台脚本的进程名或 PID,怎么停止它?
答:如果脚本是在当前 shell 会话中放到后台的,可以使用 jobs
命令查看后台作业列表,通过作业号将作业提到前台(使用 fg <作业号>
),然后使用 Ctrl + C
来中断脚本,如果脚本是在其他方式下启动的,且不知道进程名或 PID,可以尝试使用 ps aux | grep <关键字>
来查找可能的进程,<关键字>
可以是脚本中的部分命令或其他特征字符串,然后根据找到的 PID 使用 kill
命令来停止脚本。
问题 2:使用 kill -9
命令强制停止脚本有什么风险?
答:kill -9
命令会强制立即终止进程,不会给进程任何清理和保存数据的机会,这可能会导致数据丢失,比如如果脚本正在写入一个文件,可能会使文件处于损坏状态,如果进程在占用某些系统资源(如网络连接、数据库连接等),强制终止可能会导致这些资源没有正确释放,影响系统的正常运行或其他程序对这些资源的使用。
小伙伴们,上文介绍linux如何停止后台脚本的内容,你了解清楚吗?希望对你有所帮助,任何问题可以给我留言,让我们下期再见吧。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/10521.html