我知道这是一个非常常见的问题,所以我对此表示歉意,但我真的陷入困境,我已经阅读了cron 维基并尝试了所有这些建议。
我也尝试过这个家伙列出的所有东西他的问题,即:
- 将 bash 路径添加到 crontab
- 指定 Bash 脚本中进程的完整路径
- 在 crontab 中的脚本中添加 /bin/bash 作为前缀
- 我很着急,因为我要去参加一个婚礼,迫切需要这个该死的剧本能发挥作用
我可以确认该脚本在我的终端运行时有效。
因此这里是...
当前 crontab:
# add bash to cronjob path
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# start litecoin daemon on boot
@reboot /opt/litecoin-0.14.2/bin/litecoind
# check every 2 minutes to see if block scrape running and restart it if not
*/2 * * * * /home/grayedfox/github/blockscrape/restartBlockscrape.sh
脚本:
#!/bin/bash
NODEPATH=$(which node)
PROCESS="$NODEPATH /home/grayedfox/github/blockscrape/main.js"
if pgrep -f "$PROCESS" > /dev/null; then
echo "Blockscrape is doing it's thing - moving on..."
else
echo "Blockscrape not running! Starting again..."
$PROCESS
fi
我希望,即使工作失败,也会在某个地方看到某种错误,但我什么也没得到,什么也没看到!
更新:我实际上可以通过检查 /var/log/syslog 输出来查看正在运行的 cron 作业。
输出为:
CRON[15038]: (grayedfox) CMD (/home/grayedfox/github/blockscrape/restartBlockscrape.sh)
CRON[15037]: (CRON) info (No MTA installed, discarding output)
该脚本也位于它调用的节点脚本的目录中(尽管我指定了完整路径,但据我了解,当由 cron 运行时,脚本的路径是pwd
$HOME)。
答案1
虽然所有评论对@muru 有帮助建议记录对我帮助最大的脚本的结果 - 所以一定要给它一个赞!
我最终在脚本中记录了每个操作的结果,这立即表明问题不是 cron 运行作业,而是节点不适用于 cron 环境。我还更新了我的 crontab,使 shell 默认为 bash但这对于工作的开展来说并不是必要的。
这个最终的脚本有效,但是我仍然不清楚为什么第 3 行在 cron 中失败但在 bash 终端中成功,我将针对该特定问题提出一个新问题。
计划任务:
# make default shell BASH
SHELL=/bin/bash
# start litecoin daemon on boot
@reboot /opt/litecoin-0.14.2/bin/litecoind
# check every minute to see if block scrape running and restart it if not
* * * * * /home/grayedfox/github/blockscrape/restartBlockscrape.sh
Bash 脚本:
#!/bin/bash
NODE="$(which node)" # <-- output in terminal is as expected (gets node version in use) but is blank in cron job
PROCESS="/home/grayedfox/.nvm/versions/node/v8.9.4/bin/node /home/grayedfox/github/blockscrape/main.js"
LOGFILE="/tmp/log.out"
export BLOCKSCRAPECLI="/opt/litecoin-0.14.2/bin/litecoin-cli"
# source $HOME/.bashrc # <-- even after sourcing .bashrc, line 3 returns nothing
if pgrep -f "$PROCESS" > /dev/null; then
echo "Blockscrape is doing it's thing - moving on..." >> $LOGFILE
else
echo "Blockscrape not running! Starting again..." >> $LOGFILE
echo "Nodepath: $NODE" >> $LOGFILE
echo "Process: $PROCESS" >> $LOGFILE
$PROCESS >> $LOGFILE
fi