我可以在我的脚本中捕获一个 5 分钟的信号吗?我想象这样的事情,
function dosomething {
echo "It's been 5 minutes."
}
trap dosomething SIGNAL-EVERY-5-MINUTES
while true
do
sleep 10
done
Run Code Online (Sandbox Code Playgroud)
请注意,此示例没有意义。只是问是否有可能每 x 次捕获一些东西。
编辑:基于@vinc17 的回答,我注意到sleep来自主 shell 的命令没有被USR1信号中断,这就是我想要做的。
#!/bin/bash
time=10
(
set -e
while true
do
sleep 30
# Since this is run as a subshell (instead of an external command),
# the parent pid is $$, not $PPID.
kill -USR1 $$
done
) &
finish() {
kill $!
echo "Closing."
exit 0
}
changetime() {
echo "Signal USR1 received."
time=$(( $RANDOM % 8 + 1))
}
trap changetime USR1
trap finish SIGINT
while true
do
echo "before sleep"
sleep $time
echo "after sleep"
done
Run Code Online (Sandbox Code Playgroud)
输出,
before sleep
Signal USR1 received.
after sleep
before sleep
Signal USR1 received.
after sleep
before sleep
Signal USR1 received.
Closing.
Run Code Online (Sandbox Code Playgroud)
EDIT2:我编辑了上面的例子,产生了相同的输出,但增加了一个困难:睡眠时间由USR1陷阱功能改变。所以现在,每 30 秒选择 1 到 8 之间的随机时间。所以,sleep当信号改变时间时,我需要从主脚本中杀死。我坚持认为它没有意义,但我需要知道它是否可能。
您可以运行一个进程,该进程将SIGALRM每 x 次向 shell 脚本发送一个信号(例如),并为此信号使用陷阱。这个过程可能是一个脚本,执行如下操作:
set -e
while true
do
sleep 300
kill -ALRM $PPID
done
Run Code Online (Sandbox Code Playgroud)
如果由主 shell 脚本启动。
主 shell 脚本应该在不再需要时终止该进程,和/或当 pid 不再存在时该进程应该终止(但是存在竞争条件)。
(已编辑)注意:如果您的主 shell 脚本使用该sleep命令,则它可能会与ALRM信号严重交互,如果sleep它是内置的并且sleep(3)使用alarm(2). shell 实用程序的POSIX 描述sleep也在其基本原理中说:“当睡眠被 SIGALRM 信号中断时,退出状态允许为零,因为该实用程序的大多数实现依赖于该信号的到达来通知他们请求的完成时间已成功达到。因此,此类实现不会将这种情况与成功完成的情况区分开来。允许其他实现捕获信号并返回休眠直到请求的时间到期或提供正常的信号终止过程。" 为避免某些实现的潜在问题,您可以使用SIGUSR1或SIGUSR2代替SIGALRM.
这是使用子shell的示例。为了使行为更容易看到,我将 5 分钟时间段 ( sleep 300)替换为 5秒时间段 ( sleep 5)。
#!/bin/sh
{
set -e
while true
do
sleep 5
# Since this is run as a subshell (instead of an external command),
# the parent pid is $$, not $PPID.
kill -USR1 $$
done
} &
trap 'echo "Signal USR1 received."' USR1
while true
do
date
sleep 1
done
Run Code Online (Sandbox Code Playgroud)
可以使用 Ctrl-C 中断脚本。发生这种情况时,它不会终止子 shell,但如果不重用 pid,子 shell 将在不超过一段时间(此处为 5 秒)后自动终止,因为kill命令失败 ( kill: No such process)。