菜鸟科技网

如何正确终止正在运行的Shell命令?

下面我将从最简单到最复杂的情况,详细介绍各种终止命令的方法。

如何正确终止正在运行的Shell命令?-图1
(图片来源网络,侵删)

终止前台正在运行的命令

这是最常见的情况,当你运行一个命令后,它会占用你的终端,直到它自己执行完毕。

Ctrl + C

这是最常用、最标准的方法。

  • 作用:发送一个 SIGINT (Signal Interrupt) 信号给当前正在运行的进程,这个信号是请求进程中断当前操作并正常退出,大多数命令都会响应这个信号并停止。

  • 如何使用:在终端中,直接按下 Ctrl + C 组合键。

    如何正确终止正在运行的Shell命令?-图2
    (图片来源网络,侵删)
  • 示例

    # 运行一个长时间运行的命令,ping
    ping google.com
    # 在终端按下 Ctrl + C,你会看到类似下面的输出:
    # PING google.com (142.250.196.68) 56(84) bytes of data.
    # 64 bytes from lhr4s01-in-f14.1e100.net (142.250.196.68): icmp_seq=1 ttl=116 time=15.2 ms
    # 64 bytes from lhr4s01-in-f14.1e100.net (142.250.196.68): icmp_seq=2 ttl=116 time=15.1 ms
    # ^C  # <-- 在这里按下 Ctrl + C
    # --- google.com ping statistics ---
    # 2 packets transmitted, 2 received, 0% packet loss, time 1001ms
    # rtt min/avg/max/mdev = 15.123/15.167/15.211/0.044 ms

Ctrl + Z

这个方法不会终止命令,而是让它暂停并放到后台。

  • 作用:发送一个 SIGTSTP (Signal Terminal Stop) 信号,请求进程暂停(挂起)执行,进程会停止在当前状态,但不会被杀死。

  • 如何使用:在终端中,按下 Ctrl + Z 组合键。

    如何正确终止正在运行的Shell命令?-图3
    (图片来源网络,侵删)
  • 后续操作

    1. 查看暂停的作业:使用 jobs 命令。
    2. 让作业在后台继续运行:使用 bg (background) 命令。
    3. 让作业回到前台运行:使用 fg (foreground) 命令。
    4. 终止暂停的作业:使用 kill 命令(见下文)。
  • 示例

    # 再次运行 ping
    ping google.com
    # 按下 Ctrl + Z
    # [1]+  Stopped                 ping google.com  # <-- 输出表示 ping 已被暂停
    # 现在你可以输入其他命令了
    echo "Hello, I'm still here."
    # 查看当前作业
    jobs
    # [1]+  Stopped                 ping google.com
    # 终止这个作业(方法见下文)
    kill %1

    注意Ctrl + Z 只是暂停,如果关闭终端,这些被暂停的作业通常也会被终止。


终止后台或已暂停的作业

当你使用 Ctrl + Z& 符号将一个命令放到后台后,它就成了一个“作业”。

使用 kill 命令

kill 是专门用来向进程发送信号的命令,默认情况下,它发送 SIGTERM (Signal Terminate) 信号,请求进程正常退出。

  • 如何使用

    1. jobs 命令找到作业的 ID(如 [1])。
    2. 使用 kill %<作业ID> 来终止它。
  • 示例

    # 启动一个后台作业
    sleep 1000 &
    [1] 12345  # <-- 系统给出了进程ID (PID)
    # 查看所有作业
    jobs
    # [1]+  Running                 sleep 1000 &
    # 终止作业 [1]
    kill %1
    # 再次查看作业状态
    jobs
    # [1]+  Terminated              sleep 1000

使用 pkill 命令

pkill 根据进程的名称来发送信号,更方便,但可能不够精确。

  • 如何使用pkill [进程名]

  • 示例

    # 启动一个名为 my_long_script.sh 的脚本
    ./my_long_script.sh &
    # 使用 pkill 终止所有名为 "my_long_script.sh" 的进程
    pkill my_long_script.sh

使用 killall 命令

killallpkill 类似,也是根据进程名终止,但它是 Linux 系统上特有的命令,不是所有 Unix-like 系统都有。

  • 如何使用killall [进程名]
  • 示例
    ./my_long_script.sh &
    killall my_long_script.sh

强制终止命令

有些时候,Ctrl + Ckill 发送的 SIGTERM 信号可能不起作用,因为程序没有正确处理这个信号,这时就需要强制终止。

方法:Ctrl + \kill -KILL

这个方法会发送 SIGKILL 信号。

  • 作用SIGKILL 是一个“必杀”信号,它不能被程序捕获或忽略,操作系统会直接、粗暴地收回该进程的所有资源,立即终止它,这可能会导致数据丢失或文件损坏,因此应作为最后手段使用。

  • 如何使用

    1. 前台进程:按下 Ctrl + \ (反斜杠)。
    2. 后台进程kill -KILL <PID>kill -9 <PID> (-9SIGKILL 的信号编号)。
  • 示例

    # 假设一个不响应 Ctrl+C 的“僵尸”进程
    ping google.com
    # 按下 Ctrl + C,它没反应
    # 按下 Ctrl + \
    # # <-- 会看到类似 "Quit (core dumped)" 的输出,进程被强制终止

终止一个 Shell 会话中的所有命令

如果你想退出当前整个 Shell 会话,并终止其中所有相关的作业。

exit

  • 作用:正常退出当前 Shell,它会先尝试终止所有由该 Shell 启动的子进程和作业,然后关闭 Shell。
  • 如何使用:直接输入 exit 并回车。

logout

  • 作用:与 exit 类似,用于退出登录 Shell(你通过 SSH 登录后使用的 Shell)。
  • 如何使用:直接输入 logout 并回车。

Ctrl + D

  • 作用:发送一个 EOF (End-Of-File) 字符,当 Shell 在等待输入时收到 EOF,它会解释为“输入结束”,然后退出。
  • 如何使用:在命令行输入的起始位置,直接按下 Ctrl + D

总结表格

组合/命令 信号 作用 适用场景
Ctrl + C SIGINT 中断请求,命令通常正常退出。 终止前台正在运行的、可响应中断的命令。
Ctrl + Z SIGTSTP 暂停命令,并将其放到后台。 临时中断一个命令,以便稍后继续或切换到其他任务。
kill %<job_id> SIGTERM (默认) 请求进程正常退出。 终止后台或已暂停的作业(jobs 查看ID)。
kill -9 <PID> SIGKILL 强制、立即终止,无法被忽略。 Ctrl + Ckill 无效时,作为最后手段。
Ctrl + \ SIGQUIT 强制终止,并可能生成核心转储文件。 终止前台进程,是 SIGKILL 的另一种触发方式。
exit / logout N/A 退出当前 Shell 会话。 退出整个终端会话,并关闭所有相关进程。
Ctrl + D EOF 表示输入结束,触发 Shell 退出。 退出 Shell 会话的快捷方式。

最佳实践

  1. 首选 Ctrl + C:用于终止前台任务。
  2. 善用 Ctrl + Z:当你需要临时切换任务时。
  3. 慎用 kill -9:只在命令无响应时使用,因为它可能导致数据不一致。
  4. 清理后台作业:退出 Shell 之前,最好用 jobs 检查一下,用 kill 清理不需要的后台任务。
分享:
扫描分享到社交APP
上一篇
下一篇