我有一个脚本(让我们称之为观察者),如果没有运行观察者,它将检查特定进程是否会通过脚本启动该进程。
我每分钟都在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
答案 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
我希望这会对你有所帮助。