我有一个 bash 脚本,它应该在特定时间启动。我使用了 at 命令。当我使用 at 运行它时,作业会创建,并且在作业启动后但它不起作用。当我在没有 at 的情况下运行脚本时,效果很好。我认为问题出在 bash 上,因为它运行 sh 脚本。
这是我脚本的一部分:
#!/usr/local/bin/bash
IFS=' ' read -r -a array <<< "$LIST"
for element in "${array[@]}"
do
touch /tmp/$element.call
cat >> /tmp/$element.call <<-EOF
Channel: SIP/${element}
Application: Playback
Data:${FILE}
Callerid: ${CALLERID}
EOF
mv /tmp/$element.call /var/spool/asterisk/outgoing/
done
我运行 at 命令如下:
export FILE=hello-world.gsm LIST=4001 5001 6001 CALLERID=123; sudo -E at -t 20210140636.00 -f /usr/local/bin/asterisk_wakeup_call.sh
你能帮我找出问题所在吗?
谢谢
答案1
从标准输入或从给定选项的文件中读取的命令-f
在 FreeBSD 上执行sh
,根据at(1)
手动的。这意味着#!
脚本的 - 行被忽略。
要使脚本正确执行,请安排脚本的执行而不是脚本文件中的命令。
例如,您可以这样做:
echo /usr/local/bin/asterisk_wakeup_call.sh | at -t 20210140636.00
您的完整命令(假设应该LIST
是一个以空格分隔的数字的字符串):
sudo env \
FILE=hello-world.gsm \
LIST='4001 5001 6001' \
CALLERID=123 \
sh -c 'echo /usr/local/bin/asterisk_wakeup_call.sh | at -t 20210140636.00'
或者,
echo /usr/local/bin/asterisk_wakeup_call.sh |
sudo env \
FILE=hello-world.gsm \
LIST='4001 5001 6001' \
CALLERID=123 \
at -t 20210140636.00
这也用于env
将环境变量传递给我们启动的 shell,这比使用sudo -E
.如果还有其他环境变量需要按原样传递,那么您显然可以按照您想要的任何方式执行此操作。
另请注意,您的时间规范20210140636.00
是错误的。它在某处缺少一位数字(可能在当天的规范中):2021 01 40 636 .00