linux如何停止后台脚本

Linux 中,可以使用 kill 命令停止后台脚本,例如先

Linux 系统中,有时我们可能需要停止正在后台运行的脚本,以下是几种常见的方法来停止后台脚本:

使用 kill 命令

(一)查找后台进程 ID(PID)

  1. 使用 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|
    • 这里 PID1234 的进程就是我们要查找的后台脚本进程。
  2. 使用 pgrep 命令
    • pgrep 命令可以根据进程名称来查找进程 ID,对于上面提到的 my_script.sh,可以使用 pgrep my_script.sh 来获取其 PID,如果脚本是通过其他命令启动的,比如通过 bash 启动,也可以使用 pgrep bash 来查找可能的后台脚本进程,但这样可能会返回多个 PID,需要进一步筛选。

(二)发送信号停止进程

  1. 发送 SIGTERM 信号
    • SIGTERM 是一个比较温和的终止信号,它会请求进程正常退出,可以使用 kill <PID> 来发送这个信号,对于上面找到的 PID 为 1234 的进程,执行 kill 1234,这相当于告诉进程“请正常结束你的任务”,大部分程序会响应这个信号,先完成一些清理工作(如关闭文件、释放资源等)然后退出。
  2. 发送 SIGKILL 信号
    • 如果进程对 SIGTERM 信号没有响应(进程处于死循环或者被卡住无法正常退出),可以使用 SIGKILL 信号,使用 kill -9 <PID> 来发送这个信号。SIGKILL 信号会强制立即终止进程,不会给进程任何清理和保存数据的机会,只有在必要时才使用这个信号,因为它可能会导致数据丢失或系统状态不一致。

使用 jobsfg 命令结合

(一)查看后台作业

  1. 使用 jobs 命令
    • 当我们在当前 shell 会话中将脚本放到后台运行时,可以使用 jobs 命令来查看后台作业列表,假设我们将一个脚本 test_script.sh 放到后台运行,执行 jobs 后可能会看到类似如下的输出:
      [1]+  Running                 test_script.sh &
    • 这里的 [1] 是作业号,Running 表示作业正在运行,test_script.sh 是作业的命令。

(二)将后台作业提到前台并停止

  1. 使用 fg 命令
    • 可以使用 fg <作业号> 将后台作业提到前台,对于上面的作业,执行 fg 1,脚本会在前台继续运行,我们可以使用 Ctrl + C 来中断脚本的执行。Ctrl + C 会发送 SIGINT 信号给进程,大多数程序会响应这个信号并退出。

通过脚本本身的机制停止

(一)在脚本中添加信号处理

  1. 捕捉终止信号
    • 在编写脚本时,可以添加信号处理逻辑,使用 trap 命令来捕捉 SIGTERMSIGINT 信号,以下是一个简单示例脚本:
      #!/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 命令(根据进程名批量杀死)

(一)基本用法

  1. 按进程名杀死
    • pkill 命令可以根据进程名来杀死进程,如果我们有多个名为 my_script.sh 的后台脚本在运行,并且想要全部停止,可以使用 pkill my_script.sh,这会向所有名为 my_script.sh 的进程发送 SIGTERM 信号,如果想要强制杀死,可以使用 pkill -9 my_script.sh
  2. 结合通配符使用
    • pkill 支持通配符,如果我们有一组类似的脚本,如 script1.shscript2.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

(0)
酷番叔酷番叔
上一篇 2天前
下一篇 2天前

相关推荐

  • Linux如何显示文件行号?

    cat 命令 + -n 参数适用场景:快速查看小型文件(避免大文件卡顿),命令示例:cat -n filename.txt输出效果: 1 Line 1 content 2 Line 2 content 3 Line 3 content注意:-n 为所有行编号(包括空行),-b 可跳过空行编号(cat -b fi……

    2025年7月29日
    1100
  • Linux如何运行exe程序?

    通过 Wine 运行(推荐原生兼容方案)Wine(Wine Is Not an Emulator)是开源的兼容层,可将Windows API调用转换为Linux能理解的指令,无需安装完整Windows系统,安装步骤(以Ubuntu/Debian为例):启用32位架构支持(64位系统需执行): sudo dpkg……

    2025年7月23日
    1100
  • 如何在VMware快速安装CentOS 7?

    准备工作所需软件VMware Workstation Pro(官网下载)或免费版VMware PlayerCentOS 7 ISO镜像(推荐清华源:下载地址)硬件建议宿主机至少8GB内存(分配2GB+给虚拟机)20GB+可用磁盘空间启用CPU虚拟化(BIOS中开启Intel VT-x/AMD-V)注:CentO……

    2025年6月17日
    2500
  • linux 编辑如何保存退出命令行

    Linux 中,编辑文件后保存退出的命令行操作通常是:按 Esc

    1天前
    400
  • linux如何分析日志

    使用cat、less查看日志内容,grep搜索关键词,`

    6天前
    400

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-880-8834

在线咨询: QQ交谈

邮件:HI@E.KD.CN

关注微信