在crontab

时间:2017-11-07 12:57:37

标签: bash shell cron

我有一个脚本(让我们称之为观察者),如果没有运行观察者,它将检查特定进程是否会通过脚本启动该进程。

我每分钟都在crontab中运行这个观察者。现在的问题是它不能在crontab中工作,但是如果我直接从命令行运行观察器就可以工作。

假设观察者启动名为 serverA 的脚本文件。

ServerA 代码

echo -n "Starting $NAME: "

# start network server
start-stop-daemon --start --background --make-pidfile \
    --pidfile $net_server_pidfile --startas /bin/bash -- -c "exec $angel $net_server \
    -c $conf_file --lora-eui $lora_eui --lora-hw-1 $lora_hw --lora-prod-1 $lora_id \
    --lora-path $run_dir --db $conf_db \
    --noconsole >> $net_server_log 2>&1"
sleep 2
# start packet forwarder
/usr/sbin/start-stop-daemon --chdir $run_dir/1 --start --background --make-pidfile \
    --pidfile $pkt_fwd_pidfile --exec $angel -- $pkt_fwd 

renice -n -20 -p $(pgrep lora-network-se)
renice -n -20 -p $(pgrep $(basename $pkt_fwd))

echo "OK"

现在,如果我直接运行观察者,服务器A将回显输出启动,然后在一段时间后继续OK。

但是在crontab日志中我没有看到OK,因为服务从未完成且serverA永远不会启动。

watcher.sh

else
              echo "$(date) do something, no packet forwader runnig"
              exec /etc/init.d/lora-network-server start

      fi

2 个答案:

答案 0 :(得分:0)

Cron在一个空无一人的环境中运行。您是否在脚本中设置了所有必要的环境变量?

答案 1 :(得分:0)

我认为您需要检查基于终端的运行时环境的差异。

首先检查lora-network-server是否依赖于shell环境,例如JAVA_HOME或PATH(例如,可以执行没有二进制绝对路径的二进制文件)。

如果它有不同的设置,它会创建相同的shell环境。

例如,如何在cron env和运行时环境之间进行区分。

<强>运行时

$ env | tee ./runtime.output

<强>的cron

$ crontab <<EOF
* * * * * /bin/env > /path/to/cron.output 2>&1
EOF

上面的cron输出将在1分钟后产生,并在测试后移除cront。

您可以将变量检查到cron.output和runtime.output

我希望这会对你有所帮助。