我在我的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
答案 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)