【问题标题】:Crontab and sh script [closed]Crontab 和 sh 脚本 [关闭]
【发布时间】:2012-08-18 09:32:02
【问题描述】:

我有一个 sh 脚本,我想通过 cron 每三个小时调用一次。该脚本调用了一堆 node.js 脚本,并且在直接调用时可以完美运行。但是,当通过 cron 调用时,我得到了 sh 脚本记录的日期,但没有来自我的 node.js 脚本的其他日志(直接调用 sh 时所有日志都很好)。知道为什么吗?

脚本位于内部目录中,但我使用的是所有绝对路径。请在下面找到我的代码,如有必要,请在 Github 上找到有关 node.js 内容的更多详细信息(注意:服务器最近从 sh 更改为 bash,但我认为这不会产生任何实际影响)。

Crontab

SHELL=/bin/sh
MAILTO=my@email.com
0 */3 * * * /absolute/path/to/script.sh

script.sh

#!/usr/bin/env sh
node /absolute/path/to/script1.js
node /absolute/path/to/script2.js
node /absolute/path/to/script3.js

LOGFILE=/absolute/path/to/error.log

log(){
    message="$@"
    echo $message
    echo $message >>$LOGFILE
}

log "Cron performed $(date)"

【问题讨论】:

  • 来自 crond 的路径不能用于您的节点命令
  • 不这么认为。如果我使用直接从crontab -e 复制的路径调用bash /absolute/path/to/script.sh,它可以正常工作。
  • 也尝试指定node的完整路径。
  • @Primus202,但是您的脚本没有使用 bash,即使使用了,也不会使用您自己的环境。使用node的完整路径
  • 尝试了完整路径(即/usr/local/bin/node /absolute/path/to/twitterupdate.js),仍然没有骰子。

标签: bash node.js cron crontab sh


【解决方案1】:

Crontab 在调用命令时不会加载您的普通用户环境,因此您的 bash 脚本或 node.js 内容所依赖的任何其他环境变量都不会存在。例如,你的 shell 如何找到 'node' 命令?

Cron 脚本不会在您的用户帐户的 bash 环境中运行,因此直接在您的 shell 中运行它们不是有效的测试。

【讨论】:

  • 我已经尝试使用所有完整路径,即使对于节点也是如此,但仍然没有运气。 /usr/local/bin/node /absolute/path/to/twitterupdate.js
  • 您可以尝试查看您的环境,了解节点可能依赖的任何其他环境设置。一定有什么。
  • 解决方案是在我的节点脚本中包含的所有文件中使用绝对路径。谢谢。
【解决方案2】:
PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
SHELL=/bin/sh
MAILTO=my@email.com
0 */3 * * * /absolute/path/to/script.sh

【讨论】:

    猜你喜欢
    • 2021-06-27
    • 1970-01-01
    • 2012-07-05
    • 2016-04-24
    • 2020-01-18
    • 2013-08-30
    • 1970-01-01
    • 2013-09-26
    • 2018-12-06
    相关资源
    最近更新 更多