通过 crontab 执行 shell 脚本

通过 crontab 执行 shell 脚本

目前,我因尝试通过 crontab 执行 shell 脚本而陷入困境。它不起作用,我不知道这里出了什么问题。

我想做的是:定期用nodejs执行一个javascript(index.js)文件。

该文件run-logger.sh是可执行文件 ( -rwxr-xr-x),位于/home/pi/apps/fritz-client.

run-logger.sh:

#!/bin/bash

# execute index.js and save all output to log
/usr/bin/env node /home/pi/apps/fritz-client/index.js >> fritz.log

如果我独立运行此命令,/usr/bin/env node /home/pi/apps/fritz-client/index.js >> fritz.log一切都会顺利!即使我这样做cd /home/pi/apps/fritz-client && ./run-logger.sh

crontab -e:

#
# lots of comments
#

*/1 * * * * /home/pi/apps/fritz-client/run-logger.sh

crontab -l也显示了它。

我试过:

  1. */1 * * * * /home/pi/apps/fritz-client/run-logger.sh
  2. */1 * * * * /bin/bash /home/pi/apps/fritz-client/run-logger.sh
  3. */1 * * * * /bin/sh /home/pi/apps/fritz-client/run-logger.sh
  4. */1 * * * * bash /home/pi/apps/fritz-client/run-logger.sh

该命令的more /proc/version结果是:

Linux version 4.1.18-v7+ (dc4@dc4-XPS13-9333) (gcc version 4.9.3 (crosstool-NG crosstool-ng-1.22.0-88-g8460611) ) #846 SMP Thu Feb 25 14:22:53 GMT 2016

更新

这是我使用 Linux 和树莓派的第一周。所以请耐心等待:)

syslog output

Mar 14 21:08:01 raspberrypi CRON[3609]: (pi) CMD (/home/pi/apps/fritz-client/run-logger.sh)
Mar 14 21:08:01 raspberrypi CRON[3602]: (CRON) info (No MTA installed, discarding output)
Mar 14 21:09:01 raspberrypi CRON[3626]: (pi) CMD (/home/pi/apps/fritz-client/run-logger.sh)
Mar 14 21:09:01 raspberrypi CRON[3619]: (CRON) info (No MTA installed, discarding output)
Mar 14 21:10:01 raspberrypi rsyslogd-2007: action 'action 17' suspended, next retry is Mon Mar 14 21:11:31 2016 [try http://www.rsyslog.com/e/2007 ]
Mar 14 21:10:01 raspberrypi CRON[3642]: (pi) CMD (/home/pi/apps/fritz-client/run-logger.sh)
Mar 14 21:10:01 raspberrypi CRON[3635]: (CRON) info (No MTA installed, discarding output)
Mar 14 21:10:06 raspberrypi crontab[3651]: (pi) BEGIN EDIT (pi)
Mar 14 21:10:19 raspberrypi crontab[3651]: (pi) REPLACE (pi)
Mar 14 21:10:19 raspberrypi crontab[3651]: (pi) END EDIT (pi)

ps aux | grep cron

root       382  0.0  0.2   5548  2452 ?        Ss   19:01   0:00 /usr/sbin/cron -f
pi        3683  0.0  0.2   4772  1936 pts/0    S+   21:11   0:00 grep --color=auto cron

答案1

您不应该使用它,仅通过和/usr/bin/env搜索可执行文件。指定可执行文件的完整路径。node/bin/usr/bin/node

或者,您可以在 crontab 中扩展 PATH:

PATH=$PATH:/usr/local/bin

ETC。

答案2

cronjob 正在运行。正在找到并执行该run-logger.sh脚本,否则系统日志会指示这一点。但输出正在发送到您的邮件收件箱,但该收件箱已损坏。修复 MTA,以便它向您发送邮件(可能在本地),以便您可以看到输出。或者,修改您的 cronjob,以便将输出收集在文件中。

* * * * * /home/pi/apps/fritz-client/run-logger.sh &>/var/tmp/logger.out

你不需要/1——它是多余的。

修改您的 node-js 脚本,以便它也记录 stderr:

/usr/bin/env node /home/pi/apps/fritz-client/index.js >> fritz.log 2>&1

您可能无法写入fritz.log.它默认为用户的主目录。另外,是picronjob的用户吗?

相关内容