如何在 freebsd 上使用 at 命令运行 bash 脚本

如何在 freebsd 上使用 at 命令运行 bash 脚本

我有一个 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

相关内容