如何通过 Cron运行 bash 脚本



我见过其他类似的问题,但我找不到任何关于如何找出通过 Crontab 运行 Bash 脚本的正确方法的真实信息。.sh文件位于用户目录中(在我的情况下是serverpilot)。

脚本正在尝试复制 apps 文件夹的内容并发送到我的 S3 存储桶。当从终端运行sh backupS3.sh时,该脚本可以完美运行,但通过 Cron,但没有乐趣。我见过人们引用 PATH 变量等,但甚至不知道从哪里开始!

/backupS3.sh

#!/bin/sh
echo 'Started backing to S3'
date +'%a %b %e %H:%M:%S %Z %Y'
aws s3 sync /apps s3://bucketname
date +'%a %b %e %H:%M:%S %Z %Y'
echo 'Finished backing to S3'

克朗塔布

*/10 * * * * /backupS3.sh >> backupS3.log  

谁能指出我做错了什么?谢谢!

编辑:我已经在cron命令的末尾添加了2>&1,现在我在日志文件中得到了一些东西:

/bin/sh: 1: /backupS3.sh: not found

在路径名中,前导/并不意味着"主目录";它始终是指文件系统的根目录,无论您以谁身份登录。 您需要使用脚本的实际完整绝对路径(例如 /home/serverpilot/backupS3.sh)。 如果 crontab 属于其主目录包含脚本的同一用户,您可以使用 "$HOME"/backupS3.sh,系统将为您填写其主目录路径。 或者,更简单地说,只需使用 ./backupS3.sh ,因为 cron 作业从其工作目录等于其所有者的主目录开始。

如果这不起作用,那么您所说的"用户目录"与"主目录"的 POSIX 概念不同,或者脚本不可执行(您可以通过运行命令chmod +x backupS3.sh一次来修复)。

如果不确定完整路径是什么,只需在保存脚本的同一目录中运行 pwd 命令,并将输出后跟斜杠放在脚本名称前面。

我遇到了同样的问题,日志文件被创建为空,查看正在发生的事情的唯一方法是在 cron 作业结束时添加2>&1

*/10 * * * * /home/users/me/backupS3.sh >> /home/users/me/backupS3.log 2>&1

如果有人想知道2>&1实际上是什么意思,这里有一个简短的解释:

2 - 指用于标识stderr的文件描述符

1 - 指用于标识stdout的文件描述符

所以2>&1基本上翻译为:将stderr重定向到stdout

首先,将#!/bin/sh更改为#!/bin/bash,然后使用脚本的完整路径(文件名中也不需要.sh)

*/10 * * * * /home/users/me/backupS3.sh >> /home/users/me/backupS3.log  

相关内容

  • 没有找到相关文章

最新更新