0

如何在不被任何其他进程中断的情况下执行 shell 脚本中的一系列命令?

4

2 回答 2

0

如果您询问如何让 shell 进程忽略中断或其他信号,答案是通过trap命令。

trap "" 2

或者:

trap "" INT

要取消该行为,请不要在字符串中列出任何内容:

trap 2
trap INT

如果您需要删除中断(和相关信号)的临时文件,您可以使用类似的东西:

tmp=$(mktemp ${TMPDIR:-/tmp}/name.XXXXXX)
trap "rm -f $tmp; exit 1" 0 1 2 3 13 15   # EXIT HUP INT QUIT PIPE TERM

...do operations using temporary files...

rm -f $tmp
trap 0     # Cancel the exit trap

显示的信号集非常全面,涵盖了大多数正常事件。如果你收到 SIGKILL ( kill -9),临时文件将被留下——你无能为力。该mktemp命令安全地创建文件(请参阅我们为什么需要mktemp),但实际上在创建文件和设置陷阱以中断脚本并留下临时文件之间留下了一个很小的机会窗口。

于 2013-10-25T13:09:39.757 回答
0

你的意思是,没有被抢占?没门。内核调度程序可以随时自由选择要执行的任务。

但是,在 Linux 上,您可以设置“实时”优先级(即 SCHED_FIFO 或 SCHED_RR)以确保脚本不会被中断以执行较低优先级的任务。

于 2013-10-25T12:45:17.310 回答