如何让 cron 运行引用节点的 bash 脚本?

如何让 cron 运行引用节点的 bash 脚本?

我知道这是一个非常常见的问题,所以我对此表示歉意,但我真的陷入困境,我已经阅读了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

相关内容