运维必看!如何让shell脚本自杀

💡 原文中文,约5800字,阅读约需14分钟。
📝

内容提要

本文介绍了在shell脚本中实现脚本自杀的方法,包括使用killall命令杀掉脚本进程和使用trap捕捉ctrl+c信号。同时解释了bash内置命令的特殊性和后台任务与父进程的关系。

🎯

关键要点

  • 在shell脚本中,后台任务可能在脚本退出后继续运行,挂靠在init/systemd进程下。
  • 使用kill命令可以杀掉后台进程,但在循环中处理后台任务时会变得复杂。
  • 可以使用killall命令在脚本退出前杀掉脚本进程,以实现脚本自杀。
  • 使用trap捕捉CTRL+C信号,可以在脚本被中断时执行killall命令,确保所有进程终止。
  • 为了提高脚本的健壮性,可以使用pkill替代killall,并通过全路径筛选进程。
  • bash内置命令如while、for、until等在后台运行时会生成新的bash进程以提供执行环境。
  • 杀掉bash进程会导致其子进程挂靠在init/systemd下,特别是非内置命令。
  • 使用kill命令的pid值为0可以发送信号给当前进程组中的所有进程,达到杀掉所有子进程的效果。

延伸问答

如何在shell脚本中实现脚本自杀?

可以使用killall命令在脚本退出前杀掉脚本进程,确保所有进程终止。

trap命令在脚本中有什么作用?

trap命令可以捕捉信号,如CTRL+C,并在捕捉到信号时执行指定的命令,例如killall。

为什么后台任务在脚本退出后仍然运行?

因为后台任务会挂靠在init/systemd进程下,不会随着脚本退出而停止。

使用pkill替代killall有什么好处?

使用pkill可以通过全路径筛选进程,提高脚本的健壮性,确保正确杀掉进程。

如何确保脚本中的所有进程都能被终止?

可以在trap中使用kill 0命令,这样可以发送信号给当前进程组中的所有进程。

bash内置命令在后台运行时会有什么特殊行为?

bash内置命令在后台运行时会生成新的bash进程以提供执行环境,依赖于bash进程。

➡️

继续阅读