如果我运行./script.sh &
,其中脚本如下:
#!/bin/bash
echo "hello"
sleep 30
echo "hello again"
sleep 30
touch /root/foo.txt
然后我使用 ps au 来识别“睡眠”调用进程 ID,随后我通过 Kill -HUP 终止该进程。然后程序仍然结束。孩子“睡觉”会通知父母吗?
但是,如果我运行 echo"hello" && sleep 30 && echo "hello again" && sleep 30 && touch /root/testFILE.txt &
并重复该过程,程序将无法完成。为什么是这样?事实上,如果在最后一次“睡眠”期间我断开连接(因为我通过 ssh 连接到一个 ec2 实例,通过 ssh 运行 amazon linux 2),它实际上会“触摸”该文件。
断开连接应该向睡眠命令发送一个 HUP 信号(我认为),这应该具有与上一段相同的结果,但是,你瞧,当我返回时,文件就在那里......
(注意:如果我通过 Kill -HUP 手动在最后一次“睡眠”期间发送 hup 信号,则也不会创建该文件...)发生了什么事?它是否有可能与它是一个 ec2 实例有关,或者这只能由 unix 操作系统来解释?
答案1
无论如何,该脚本都会运行所有命令。在命令行中,您使用的是&
not ;
,因此每个命令仅在前一个命令成功时才会运行。终止睡眠并不成功,或者如果您愿意的话,返回值不是 0(成功!),而是 129,这不是成功。
顺便说一句,值 129 是信号编号(HUP 为 1)加上 128,如果您使用 SIGTERM(信号 15),则为 143。无论哪种方式,129 或 143 都不是 0,因此命令字符串中的下一个命令将不会运行。