我收到此错误if: Expression Syntax.
在此脚本上
#!/bin/sh
pmon_num=`ps -ef | grep pmon | wc -l`
echo $pmon_num
if [ $pmon_num -gt 1 ]
then
#code
fi
如果我像这样运行脚本:/tmp/script.sh
- 它有效。但错误来自crontab。 Crontab行是这样的:
* * * * * /tmp/script.sh > /tmp/log.log 2>&1 &
ls -l
上的 /tmp/script.sh
:
-rwxr--r-- 1 oracle dba 705 Dec 12 07:10 /tmp/script.sh
不能理解这个问题。
编辑:
我还尝试将if语句更改为:
if [ 1 -gt 1 ]
我仍然有错误。
答案 0 :(得分:1)
我认为这不是Bash错误消息。所以,cron显然是在调用一个不同的shell(也许是csh?)。要解决此问题,并确保使用适当的解释器运行,请更改此:
#!/bin/sh
到此:
#!/bin/bash
答案 1 :(得分:1)
在cron中执行的脚本没有PATH,也没有源系统或用户配置文件。该脚本没有找到命令ps,grep和wc,因此$ pmon_num为空。
在脚本中设置PATH或完全限定命令的路径名。
另外,为什么要使用grep和pipe来wc -l?您可以使用grep -c,因为您不希望在一行中有几个pmon,它将返回计数。
编辑:
为您添加修改后的代码。
#!/bin/sh
pmon_num=`/bin/ps -ef | /bin/grep -c pmon`
echo $pmon_num
if [ $pmon_num -gt 1 ]
then
#code
fi
编辑:
以下是如何测试你的cron对PATH和不合格命令的看法。
#!/bin/sh
echo $PATH > /tmp/cronjob.out
which ps >> /tmp/cronjob.out 2>&1
which grep >> /tmp/cronjob.out 2>&1
which wc >> /tmp/cronjob.out 2>&1
在cron执行此脚本后,请检查/tmp/cronjob.out。
的内容答案 2 :(得分:0)
由于它在您当前的环境中工作,请尝试修复SHELL,PATH变量和解释器,看看是否仍然出现错误。例如运行
printf "SHELL=$SHELL\nPATH=$PATH\n* * * * * /bin/sh /tmp/script.sh > /tmp/log.log 2>&1 &\n"
这会给你一些像
这样的输出SHELL=/bin/tcsh
PATH=/usr/lib:/usr/bin:etc...
* * * * * /bin/sh /tmp/script.sh > /tmp/log.log 2>&1 &
但包含你的SHELL和PATH。然后使用crontab -e
再次编辑任何一个crontab,并将其替换为上面的输入,看看它是否正常工作。
答案 3 :(得分:0)
请记住sh != bash
!如果你想要bash然后告诉它! #!/usr/bin/env bash
!
答案 4 :(得分:-1)
替换:
if [ $pmon_num -gt 1 ]
then
fi
使用:
if ( $pmon_num > 1 ) then
endif