如何通过Cron运行bash脚本

如何通过Cron运行bash脚本,bash,cron,Bash,Cron,我见过其他类似的问题,但我找不到任何关于如何通过Crontab正确运行Bash脚本的真实信息。.sh文件位于用户目录中(在我的例子中是serverpilot) 脚本正在尝试复制apps文件夹的内容并发送到我的S3存储桶。当从终端使用sh backupS3.sh运行脚本时,该脚本工作正常,但通过Cron没有任何乐趣。我见过有人引用路径变量之类的东西,但不知道从哪里开始 /backupS3.sh #!/bin/sh echo 'Started backing to S3' date +'%a %b

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

脚本正在尝试复制
apps
文件夹的内容并发送到我的S3存储桶。当从终端使用
sh backupS3.sh
运行脚本时,该脚本工作正常,但通过Cron没有任何乐趣。我见过有人引用路径变量之类的东西,但不知道从哪里开始

/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:在路径名中未找到

,前导的
/
并不表示“主目录”;它总是指文件系统的根,无论您以谁的身份登录。您需要使用脚本的实际完整绝对路径(例如
/home/serverpilot/backupS3.sh
)。如果crontab属于其主目录保存脚本的同一用户,则可以使用
“$home”/backupS3.sh
,系统将为您填写其主目录路径。或者,更简单地说,只需使用
/backupS3.sh
,因为cron作业的工作目录与其所有者的主目录相同

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

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

首先,更改
#/bin/sh
#/bin/bash
,接下来使用脚本的完整路径(文件名中也不需要.sh)


我也遇到过同样的问题,日志文件被创建为空,查看发生了什么的唯一方法是在cron作业的末尾添加
2>&1

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

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

2-指用于标识
stderr

1-指用于标识标准输出的文件描述符


所以
2>&1
基本上就是:重定向
stderr
stdout

你说它不工作,但是实际发生了什么?抱歉@JordonPhillips脚本没有运行,我相信因为同步从未发生,而且echo语句没有打印到logI中,所以应该指出它正在创建日志文件,但日志文件仍然是空的。您的脚本是
sh
脚本,但是使用
bash
运行它是无害的。相反的观点通常不成立。不管怎样,在它跳起来咬你之前,你应该理解它们之间的区别。同样,这不是一个真正的编程问题;服务器故障将是未来更好的选择。谢谢。当你说使用完整路径时,我不知道该指向哪里?我已经将Crontab添加到
serverpilot
用户中(我也可以访问服务器的根目录,但认为最好以serverpilot身份登录)。我知道它的完整服务器路径,我应该使用它吗?
bash
提示是一种误导;您的脚本当前不包含任何特定于Bash的构造。感谢您提供的信息@triplee@tripleee红鲱鱼?这是额外的和建设性的,因为用户将此作为一个“bash问题”发布,不需要否决,因为路径是问题所在。事实上,我阅读了整个答案,如果您删除了不正确的部分就可以了。在很多情况下,这个建议会有所帮助,但这不是其中之一。不管怎么说,在我看来,推荐它是基于糟糕的原则(顺便说一句,不是“原则”)。谢谢,我应该在哪里运行
chmod
命令?作为航站楼的一次性服务?是的,只需运行一次。非常感谢。顺便提一下,脚本本身中的
aws s3 sync/apps s3://bucketname
行是否知道要查找的位置,或者是否也需要完整的服务器路径?再次感谢。如果目录是
/apps
,太好了。如果它是用户主目录下的
apps
,那么它也需要是
“$home”/apps
。当Cron运行作业时,它会在您的主目录中启动。也许你只需要
/backupS3.sh
*/10 * * * * /home/users/me/backupS3.sh >> /home/users/me/backupS3.log