3

我有一个 bash shell 脚本。它写入一个文本文件。如果我在命令级别使用 control-c 停止脚本,它的大部分工作都会找到。有时写入的文件例如

echo "hello world" >myfile.txt

最终会是空的。因此,当我点击 control-c 停止运行 shell 脚本时,它可能会在它打开文件写入的实例中被捕获,并且在将任何内容放入其中之前,它没有机会并离开它空的?

如果是这样的话。我可以在 bash shell 脚本中做什么,以便它在写入文件后和有机会再次写入文件之前优雅地退出,因为它是在 while 循环中执行此操作的。谢谢!

4

1 回答 1

3

是的,您最终可能会得到一个空文件。

一个解决方案是捕获由 ^C ( ) 引起的信号SIGINT,并设置一个可以在循环中检查的标志:

triggered=0

trap "triggered=1" SIGINT

while true
do
  if [ $triggered = 1 ]
  then
    echo "quitting"
    exit
  fi
  ...do stuff...
done

编辑:没有意识到即使 shell 自己的 SIGINT 处理会被困住,它仍然会将 SIGINT 传递给它的子进程,如果他们自己不处理 SIGINT,它们就会被杀死。

由于echo是内置的外壳,它可能会在杀戮中幸存下来,但我并不完全确定。快速测试似乎可以正常工作(文件总是被写入,而没有捕获 SIGINT,我偶尔也会得到一个空文件)。

正如@spbnick 在评论中所建议的那样,在 Linux 上,您可以使用该setsid命令为您启动的任何子进程创建一个新的进程组,这将防止它们被发送到 shell 的 SIGINT 杀死。

于 2013-05-13T05:10:28.083 回答