如何在 shell 脚本中按下 Control+C 时取消进程?
How to cancel a process when Control+C is pressed in a shell script?
我有一个脚本可以完成一些工作。它以正确的方式进行,但需要一段时间才能结束。因为我想模拟 "job is running now" 我添加了一个微调光标动画。
我在我的脚本开头调用它,然后我将该函数的 PID 分配给一个变量,当一切都完成后,我简单地杀死它以停止动画。
#!/bin/bash
spinner &
SPINNER_PID=$!
# a lot of stuff going on here...
# takes some time to finish
kill $SPINNER_PID &>/dev/null
printf "All done"
函数定义:
spinner() {
local i sp n
sp='/-\|'
n=${#sp}
while sleep 0.1; do
printf "%s\b" "${sp:i++%n:1}"
done
}
如果我不打扰,一切都很好。
想象一下,我想通过调用 Control+C
来取消我的长任务。它取消了,但微调器显然仍然有动画,因为它注意到其他地方是一个无限循环。
当脚本被手动取消并且不会达到 kill $SPINNER_PID &>/dev/null
时,我如何杀死它?
似乎有一个名为 trap
的语句允许您在按下 Ctrl-C
时 运行 编码。有很好的解释here, and this website
解释如何 运行 Ctrl-C
上的函数。
trap your_func INT
我有一个脚本可以完成一些工作。它以正确的方式进行,但需要一段时间才能结束。因为我想模拟 "job is running now" 我添加了一个微调光标动画。
我在我的脚本开头调用它,然后我将该函数的 PID 分配给一个变量,当一切都完成后,我简单地杀死它以停止动画。
#!/bin/bash
spinner &
SPINNER_PID=$!
# a lot of stuff going on here...
# takes some time to finish
kill $SPINNER_PID &>/dev/null
printf "All done"
函数定义:
spinner() {
local i sp n
sp='/-\|'
n=${#sp}
while sleep 0.1; do
printf "%s\b" "${sp:i++%n:1}"
done
}
如果我不打扰,一切都很好。
想象一下,我想通过调用 Control+C
来取消我的长任务。它取消了,但微调器显然仍然有动画,因为它注意到其他地方是一个无限循环。
当脚本被手动取消并且不会达到 kill $SPINNER_PID &>/dev/null
时,我如何杀死它?
似乎有一个名为 trap
的语句允许您在按下 Ctrl-C
时 运行 编码。有很好的解释here, and this website
解释如何 运行 Ctrl-C
上的函数。
trap your_func INT