【问题标题】:How to run a bash script via Cron如何通过 Cron 运行 bash 脚本
【发布时间】:2016-10-01 03:55:44
【问题描述】:

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

crontab

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

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

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

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

【问题讨论】:

  • 你说它不起作用,但实际上发生了什么?
  • 抱歉@JordonPhillips 脚本没有运行我相信因为同步永远不会发生并且回显语句没有打印到日志中
  • 我应该指出它正在创建日志文件但日志文件仍然为空
  • 您的脚本是sh 脚本,但使用bash 运行它是无害的。反之一般不成立。无论哪种方式,您都应该在它跳起来咬您之前了解其中的区别。参见例如stackoverflow.com/questions/5725296/…
  • 另外,这不是一个真正的编程问题; serverfault 会是未来更好的选择。

标签: bash cron


【解决方案1】:

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

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

如果有人想知道2>&1 的真正含义,这里有一个简短的解释:

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

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

所以2>&1 基本上翻译为:重定向stderrtostdout

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 谢谢,我应该在哪里运行 chmod 命令?作为在终端的一次性?
    • 是的,它只需要运行一次。
    • 非常感谢。顺便说一句,脚本本身中的aws s3 sync /apps s3://bucketname 行,它会知道去哪里看还是需要完整的服务器路径?再次感谢。
    • 如果目录是/apps,很好。如果是用户主目录下的apps,那么也需要是"$HOME"/apps
    • 当 Cron 运行一个工作时,它会从你的 home driectory 开始。也许你只需要./backupS3.sh
    【解决方案3】:

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

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

    【讨论】:

    • 谢谢。当您说使用完整路径时,我不确定该指向哪里?我已将 Crontab 添加到 serverpilot 用户(我也可以访问服务器的根目录,但我认为最好以 serverpilot 身份登录)。我知道它的完整服务器路径,我应该使用它吗?
    • bash 提示是红鲱鱼;您的脚本目前不包含任何特定于 Bash 的结构。
    • 感谢@triplee 提供的信息
    • @tripleee 红鲱鱼?这是额外的和建设性的,因为用户将此作为“bash 问题”发布。不需要投票,因为路径是问题。
    • 事实上,我已经阅读了整个答案,如果您删除了不正确的部分就可以了。在很多情况下,该建议 有所帮助,但这不是其中之一。无论如何推荐它对我来说就像cargo cult programming,我认为这是基于糟糕的原则(顺便说一句,不是“principals”)。
    猜你喜欢
    • 2023-03-06
    • 2012-08-09
    • 2012-10-22
    • 2019-07-23
    • 2018-08-23
    • 2011-03-13
    • 1970-01-01
    • 2011-08-10
    • 2013-11-26
    相关资源
    最近更新 更多