【问题标题】:shell script not working through cron but manuallyshell脚本不能通过cron工作,而是手动工作
【发布时间】:2015-07-24 07:02:07
【问题描述】:

我在 shell 脚本中使用以下命令:

echo "1" > log.txt  
if [ `ifconfig eth0 | grep 'inet addr' | cut -d ":" -f 2 |  
awk {'print $1'}` = 'ipaddress' ] && [ `whoami` = 'userid' ]; then  
echo "2" >> log.txt  
crontab -l > Cron.txt  
echo "3" >> log.txt  
fi 

脚本在手动运行时运行良好,但通过 cron 调度时,它 卡在这个 IF 上。

cron entry: 31 11 * * * /home/abc/cron_backup.sh  

在log.txt中输出手动运行:通过log.txt打印1,2,3 cron:在 log.txt 中打印 1

【问题讨论】:

  • 如何手动运行命令?
  • Linux 2.6.32-504.12.2.el6.x86_64
  • 2015 x86_64 x86_64 x86_64 GNU/Linux

标签: bash shell cron


【解决方案1】:

问题可能出在 ifconfig、grep、cut awk 和 whoami 调用上。当您从命令行运行它时,您将获得您的配置文件,其中包含您的 PATH 设置。

当它从 cron 运行时,它没有您的配置文件。如果您修改 PATH 变量以指向这些程序的位置,那么从 cron 运行时您将不会有这种变化。

尝试为每个命令输入完整路径,看看它在从 cron 运行时有什么不同。

【讨论】:

    【解决方案2】:

    我建议将命令解释器行 #! 作为脚本的第一行确保 sh 会运行它

    之后,你有没有考虑使用双括号语法 [[ ]]?

    #!/bin/sh
    echo "1" > log.txt  
    if [[ `ifconfig eth0 | grep 'inet addr' | cut -d ":" -f 2 |  
    awk {'print $1'}` = 'ipaddress' ]] && [[ `whoami` = 'userid' ]]; then  
    echo "2" >> log.txt  
    crontab -l > Cron.txt
    echo "3" >> log.txt  
    fi 
    

    【讨论】:

    • #!/bin/bash 代替#!/bin/sh 不是更好吗?
    • 谢谢...我包括了#!/bin/sh,但它仍然无法从 cron 中运行。双括号的作用是什么?
    • 由于手动运行脚本运行成功,应该没有语法问题...对。我已经尝试过 #!/bin/bash 和 #!/bin/sh。还有双括号 [[ ]]。
    • 不应该有语法问题,除非您没有使用相同的解释器运行。事实上,知道这一点的好方法是在成功运行脚本的地方运行“echo $SHELL”,并将其用于#!设置(如果与您之前尝试的不同)
    • 我用过的",',`会有什么问题吗。'|'周围的空格好的。
    猜你喜欢
    • 2017-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-08
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 2015-12-13
    相关资源
    最近更新 更多