【问题标题】:Bash Script works but not in when executed from crontabBash 脚本有效,但在从 crontab 执行时无效
【发布时间】:2014-07-31 12:57:41
【问题描述】:

我是 linux 新手,下面的脚本只是我的问题的一个示例:

我有一个脚本,当我执行它时,它按预期工作,但是当我将它设置为通过 crontab 运行时,它没有按预期工作,因为它没有将文件内容读入变量。

我有一个文件“test.txt”,其中包含“abc”。我的脚本将文本放入变量“var”中,然后将其回显到日志文件中:

var=$(</home/pi/MyScripts/test.txt)
echo "$var" >/home/pi/MyScripts/log.log

当我执行它并将它回显到日志文件时,它工作得非常好,但当我通过 crontab 设置它时却没有:

* * * * * /home/pi/MyScripts/test.sh

cron 作业运行,它向我发送了以下错误消息:

/bin/sh: 1: /home/pi/MyScripts/test.sh: Permission denied.

但是我给了它777个权限:

-rwxrwxrwx 1 pi pi   25 Jun 10 15:31 test.txt
-rwxrwxrwx 1 pi pi   77 Jun 10 15:34 test.sh

有什么想法吗?

【问题讨论】:

  • 确保把shebang放在上面。喜欢#!/bin/bash。
  • 您希望它多久执行一次?每分钟?
  • 如果它无法打开文件,您会收到一封通过电子邮件发送给您的错误消息。
  • 无论您遇到什么其他问题,0777 总是错误的,并且存在安全风险。对此的健全权限将是例如 0755。
  • @JakeGould 您需要 +x 在所有导致执行脚本的目录上,即使脚本本身是 777 并且您使用绝对路径。此外,错误在于执行/home/pi/MyScripts/test.sh。不执行此文件的第 1 行。

标签: linux bash shell cron crontab


【解决方案1】:

当您使用不同的 shell 运行脚本时会发生这种情况。这对于/bin/sh 为dash 的系统尤其重要:

$ cat myscript 
echo "$(< file)"

$ bash myscript
hello world

$ sh myscript

$ 

要修复它,请将#!/bin/bash 添加为脚本的第一行。

【讨论】:

    【解决方案2】:

    其他人已经提供了答案,但我会从你的错误信息中给你一个很大的线索;强调我的:

    /bin/sh:1:/home/pi/MyScripts/test.sh:权限被拒绝。

    请注意 cron 作业如何尝试使用 /bin/sh 来运行脚本。这可以通过始终在脚本顶部指示您要使用的 shell 来解决。

    #!/bin/bash
    var=$(</home/pi/MyScripts/test.txt)
    echo "$var" >/home/pi/MyScripts/log.log
    

    如果您的脚本使用bash,那么您必须以某种方式显式设置/bin/bash。

    另外,关于您所说的权限:

    但是我给了它777个权限:

    首先,777 权限是一个巨大的安全风险。如果您这样做,则意味着系统上的任何人或任何东西都可以读取、写入和执行该文件。不要那样做。对于 cron 作业,唯一需要对文件具有 7 权限的实体是运行该文件的 crontab 的所有者。

    意思是如果这是你的crontab,只需将权限更改为755,它允许其他人读取和执行但不能写入。或者,最好将其更改为 700,这样只有您(作为文件的所有者)才能对文件执行任何操作。但是,如果您想保持系统安全、稳定和健全,请避免使用 777 权限。

    【讨论】:

    • 0755 被组和其他人读取和执行,而不是读取和写入(它是你想要阻止的写入)。
    • @tripleee 你是对的。今天有点混。 755 很好,因为它允许组成员和其他人执行和读取文件。但他们不能写。这是一种允许访问但不会冒险在可执行文件中意外覆盖内容的有用方法。
    【解决方案3】:

    你有两个选择。在文件的第一行中,告诉您要解释脚本的程序

    #!/bin/bash
    ...more code...
    

    或者在你的 crontab 中,告诉你要解释脚本的程序

    * * * * * bash /home/pi/MyScripts/test.sh
    

    在此选项中,您不需要使脚本可执行

    【讨论】:

    • * * * * * sh /home/pi/MyScripts/test.sh 会导致同样的错误,因为这是一个 bash 脚本,并且该错误清楚地表明标准 shell (/bin/sh) 正在尝试运行它。
    • @JakeGould,那么这两个命令中的任何一个都正确吗?可以通过在顶部写 #!/bin/sh 来解决吗?
    • 第一个是正确的。第二个,不是。用户正在使用bash,而不是sh。
    • @JakeGould,我做出了改变。
    猜你喜欢
    • 2016-04-03
    • 2021-08-23
    • 1970-01-01
    • 2011-10-11
    • 1970-01-01
    • 1970-01-01
    • 2013-04-19
    • 2021-03-12
    • 1970-01-01
    相关资源
    最近更新 更多