Bash脚本命令未运行

时间:2015-05-18 12:47:57

标签: linux bash shell

我在我的NAS上运行了seafile(http://www.seafile.com/en/home/)我设置了一个每隔几分钟运行一个脚本的cron选项卡来检查seafile服务器是否启动,如果没有,它将启动它

脚本如下所示:

#!/bin/bash
# exit if process is running
if ps aux | grep "[s]eafile" > /dev/null
then exit
else
# restart process
/home/simon/seafile/seafile-server-latest/seafile.sh start
/home/simon/seafile/seafile-server-latest/seahub.sh start-fastcgi
fi

单独/手动运行/home/simon/seafile/seafile-server-latest/seafile.sh start/home/simon/seafile/seafile-server-latest/seahub.sh start-fastcgi没有问题,但是当我尝试手动运行此脚本文件时,这些行都没有执行,seafile / seahub也没有启动

我的脚本中是否存在阻止执行这两行的错误?我已确保将脚本文件chmod为755

3 个答案:

答案 0 :(得分:3)

问题很可能是当你将命令传递给另一个时,你不能保证第二个命令不会在第一个命令之前启动(它可以启动,但在等待输入时不做任何事情)。例如:

oj@ironhide:~$ ps -ef | grep foo
oj        8227  8207  0 13:54 pts/1    00:00:00 grep foo

我的计算机上没有运行包含“foo”字样的进程,但我grep的{​​{1}}出现在ps生成的进程列表中。< / p>

您可以尝试使用ps代替,这非常适用于此类事情:

pgrep

或者您可以添加其他管道来过滤掉包含if pgrep "[s]eafile" 的结果:

grep

答案 1 :(得分:0)

如果此脚本的名称与正则表达式[s]eafile匹配,则它将始终采用exit分支。

你可能应该使用pidof而不是重新发明牦牛棚。

答案 2 :(得分:0)

结果证明脚本本身工作正常,尽管使用pgrep的更改要好得多。问题实际上是在crontab中(不包括命令中的sh)