【问题标题】:cron job - ack: command not foundcron 作业 - 确认:找不到命令
【发布时间】:2014-10-27 13:49:55
【问题描述】:

我编写了一个 bash 脚本,用于识别文件中是否存在某个字符串,然后将文件名输出到“noString.txt”的“hasString.txt”。我正在使用ack -i 'mystring' 'searchDir' 来查找我要查找的内容。

奇怪的是,当我通过终端手动调用脚本时,它运行良好,但是当 cron 调用脚本时,我得到以下错误消息输出:

~/sourceDir/script.sh: line 30: ack: command not found.

为什么手动调用会起作用,但是cron调用却找不到ack命令?


编辑:添加相关代码和cron文件

Lookout 脚本 - 确定是否有要处理的文件。

    if [[ $(ls -A ${PWD}/*.zip) ]]; then
        while [ $different -eq 1 ]; do
            du -h 1> $compare1
            ls -laR >> $compare1 
            sleep 25s
            du -h 1> $compare2
            ls -laR >> $compare2

            if cmp $compare1 $compare2 ; then   
                mkdir -p $LOGAREA
                mkdir -p $workarea/zip/unzip
                touch $LOG
                touch $ERRORLOG
                sleep 2s
                source ~/Desktop/Scripts/readfolderfiles.sh $drop
                mv *epub $workarea
                rm $compare1
                rm $compare2
                bash ~/Desktop/Scripts/Page_Label/script/searchString.sh
                different=0
            else
                echo
            fi
        done 1> $LOG 2> $ERRORLOG
    else
    rm ~/Desktop/page_labels.running
    rm $drop/page_labels.running
    fi 

识别和报告脚本 - 生成顶部提到的输出

for files in *.zip; do
    #move and unzip the files
    mv $workarea/$files $workarea/zip/unzip/${files%.epub}.zip
    sleep 2s
    unzip zip/unzip/*.zip -d zip/unzip/${files%.epub}
    mv zip/unzip/*.zip zip
    sleep 2s
    cd $workarea/zip/unzip
    for dir in *; do
        # Search the files for the searchString
        if ack --ignore-case 'searchString' $dir; then
            echo $dir >> $drop/Has_searchString.txt
            echo
            rm -r $dir
            sleep 5s
        else
            echo $dir >> $drop/No_searchString.txt
            echo
            rm -r $dir
            sleep 5s
        fi
    done
    cd $workarea
done

Cron 文档

#!/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin

#### Backup Files
* * * * 1,2,3,4,5 bash  ~/Desktop/Scripts/searchScript.sh &> /dev/null;

【问题讨论】:

  • cron的环境非常有限,ack的路径可能是未知的。因此,您可以在脚本中添加完整路径(/bin/ack -i 'mystring' 'searchDir' 或您从which ack 获得的任何内容)。
  • @fedorqui 我试过了。没有骰子。仍然只在手动调用时有效
  • 好的,然后将代码的相关部分与您的 cronjob 语法一起发布。
  • 问题(或至少其中一个问题)是您使用~ 来处理主目录。 Crontab 不知道,所以需要使用完整路径。
  • mv $workarea/$files 行可能没有任何用处; mv 需要两个参数,而您似乎只给它一个。您应该运行脚本并将输出转到日志文件而不是/dev/null;这将使您更容易看到发生了什么问题。您还应该修改脚本以打印其环境(临时),以便您可以看到PATH 的实际值是cron 运行脚本时的值。您在这些脚本中使用的任何其他程序是否也在/usr/local/bin 中?您的主脚本写入$ERRORLOG。那里有什么有用的信息吗?

标签: bash cron ack


【解决方案1】:

您需要在 cron 作业中设置 PATH 环境变量。 所以在 cron 文件的顶部添加这个:

 #!/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin

注意:还要加上#!/bin/bash,这样你就不必再添加shell环境变量了。

【讨论】:

  • 是的,我的错。谢谢:)
  • 我尝试将它添加到我的 cron 设置中,但没有骰子。 #!/bin/bashPATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin* * * * * bash ~/script &> /dev/null;
【解决方案2】:

这是因为没有定义搜索路径。

在脚本中使用完整路径或定义路径

选项 1:

/path/to/ack -i 'mystring' 'searchdir'

选项 2:

PATH=/path/to/ackdir:$PATH
export PATH

ack -i 'mystring' 'searchdir'

【讨论】:

  • 我尝试在 shell /usr/local/bin/ack 中添加 ack 的完整路径,但还是不行。我也尝试将选项 2 添加到我的 cron 文件中,但也没有运气。
  • 查看您在问题中提供的脚本和 cronjob。请确保您避免使用 home 快捷方式 ~/ 这是因为您可以在用户主文件夹 /home/user 中编写脚本,但 cronjobs 在 root 用户下运行,因此在这种情况下 ~/ 的含义会有所不同。除非您在同一用户下定义 cronjob。
  • 我昨天确实删除了~ 快​​捷方式并用硬路径替换它。没有改变结果。
  • @ArunasV.:不,cron 作业在执行crontab 命令安装它的用户下运行。以 root 身份运行 cron 作业将是一个可怕的安全漏洞。
猜你喜欢
  • 1970-01-01
  • 2015-11-15
  • 1970-01-01
  • 2022-10-25
  • 2020-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-27
相关资源
最近更新 更多