我见过其他类似的问题,但我找不到任何关于如何找出通过 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