Bash脚本不是通过cron和sh运行,而是使用./filename.sh运行正常

时间:2017-05-09 06:18:50

标签: bash cron

我有一个crontab无法运行的代码

我正在使用./filename.sh来运行它。当我手动执行此操作时,运行正常

但是当我尝试时通过cron

for ((i=0; i<retries; i++)); do

    curl -1 --cipher ALL --connect-timeout 90 -T $zip_name ftps://ftp.box.com/Backup/$zip_name --user admin:pas    [[ $? -eq 0 ]] && break

    echo "something went wrong, let's wait 6 seconds and retry"
    sleep 6
done

[[ $retries -eq i ]] && { echo "This email is being sent as a notifer of Failure, Support" | mail -s "Dump Failed" "asdfas4@gmail.com"  ; exit 1; }

这不起作用

Syntax error: Bad for loop variable

当我使用sh

运行时

它说public List<int> MyMethod() { ... try { //add elements to list } catch(Exception e) { Error.WriteLine("Element cannot be negative, but other elements are ok"); } ... } [TestMethod] public void TestWithNegatives() { try { List<int> list = MyMethod(); //there is a negative int in list, so there'll be an error message } catch (Exception e) { //Can I check here the error message, if there isn't exception thrown in mymethod? } }

3 个答案:

答案 0 :(得分:3)

据推测,cron的外壳是dash(不是bash)。在Ubuntu(和派生词)sh只是dash的符号链接。

你可以:

  • 在您的脚本顶部添加一个shebang - #!/bin/bash(或#!/usr/bin/env bash),推荐方法

  • 将脚本作为参数运行到bash/bin/bash /path/to/script.sh适度推荐

  • SHELL=/bin/bash不推荐)中设置crontab,甚至可以将SHELL设置为bash运行任何一个命令,但再次使用shebang方法

此外,请始终尝试使用绝对路径指向crontab中的任何文件,并cron以修改后的PATH运行。

现在,即使在bash中,您的for构造的语法也不正确,您需要算术运算符(()),而不是子shell(()):

for ((i=0; i<retries; i++)); do ...; done

答案 1 :(得分:0)

如果您通过.运算符来源脚本,则会忽略脚本中的shebang #!/bin/bash。该脚本在你的cron的shell中执行,它不是bash,它不支持你正在使用的循环。

在脚本中添加shebang并从cron文件中删除.

*/5 * * * * /home/ubuntu/filename.sh >> /filename.sh

或者只是按以下方式编辑cron文件:

*/5 * * * * /bin/bash /home/ubuntu/filename.sh >> /filename.sh

答案 2 :(得分:0)

不要使用。当您提供脚本的完整路径时,请尝试运行以下命令:

*/5 * * * *  /home/ubuntu/filename.sh 

它应该有效,如果有更多细节,请告诉我。