Linux Bash脚本命令未运行

Linux Bash脚本命令未运行,linux,bash,shell,Linux,Bash,Shell,我在NAS上运行了seafile(),我设置了一个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/seafil

我在NAS上运行了seafile(),我设置了一个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/seafile server latest/seahub.sh start fastcgi
不会出现问题,但当我尝试手动运行此脚本文件时,这些行都不会执行,seafile/seahub也不会启动


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

问题可能是,当您将命令相互导入时,无法保证第二个命令不会在第一个命令之前启动(它可以启动,但在等待输入时不会执行任何操作)。例如:

oj@ironhide:~$ ps -ef | grep foo
oj        8227  8207  0 13:54 pts/1    00:00:00 grep foo
我的机器上没有运行包含单词“foo”的进程,但是我正在管道
ps
grep
将显示在
ps
生成的进程列表中

您可以尝试改用
pgrep
,它基本上是为这类事情而设计的:

if pgrep "[s]eafile"
或者,您可以添加另一个管道以过滤出包含
grep
的结果:

ps aux | grep "[s]eafile" | grep -v grep

问题很可能是,当您将命令导入另一个命令时,您无法保证第二个命令不会在第一个命令之前启动(它可以启动,但在等待输入时不会执行任何操作)。例如:

oj@ironhide:~$ ps -ef | grep foo
oj        8227  8207  0 13:54 pts/1    00:00:00 grep foo
我的机器上没有运行包含单词“foo”的进程,但是我正在管道
ps
grep
将显示在
ps
生成的进程列表中

您可以尝试改用
pgrep
,它基本上是为这类事情而设计的:

if pgrep "[s]eafile"
或者,您可以添加另一个管道以过滤出包含
grep
的结果:

ps aux | grep "[s]eafile" | grep -v grep

问题很可能是,当您将命令导入另一个命令时,您无法保证第二个命令不会在第一个命令之前启动(它可以启动,但在等待输入时不会执行任何操作)。例如:

oj@ironhide:~$ ps -ef | grep foo
oj        8227  8207  0 13:54 pts/1    00:00:00 grep foo
我的机器上没有运行包含单词“foo”的进程,但是我正在管道
ps
grep
将显示在
ps
生成的进程列表中

您可以尝试改用
pgrep
,它基本上是为这类事情而设计的:

if pgrep "[s]eafile"
或者,您可以添加另一个管道以过滤出包含
grep
的结果:

ps aux | grep "[s]eafile" | grep -v grep

问题很可能是,当您将命令导入另一个命令时,您无法保证第二个命令不会在第一个命令之前启动(它可以启动,但在等待输入时不会执行任何操作)。例如:

oj@ironhide:~$ ps -ef | grep foo
oj        8227  8207  0 13:54 pts/1    00:00:00 grep foo
我的机器上没有运行包含单词“foo”的进程,但是我正在管道
ps
grep
将显示在
ps
生成的进程列表中

您可以尝试改用
pgrep
,它基本上是为这类事情而设计的:

if pgrep "[s]eafile"
或者,您可以添加另一个管道以过滤出包含
grep
的结果:

ps aux | grep "[s]eafile" | grep -v grep

如果此脚本的名称与regex
[s]eafile
匹配,它将始终执行
exit
分支


您可能应该使用
pidof
,而不是改造牦牛棚

如果此脚本的名称与regex
[s]eafile
匹配,则它通常会执行
退出
分支


您可能应该使用
pidof
,而不是改造牦牛棚

如果此脚本的名称与regex
[s]eafile
匹配,则它通常会执行
退出
分支


您可能应该使用
pidof
,而不是改造牦牛棚

如果此脚本的名称与regex
[s]eafile
匹配,则它通常会执行
退出
分支


您可能应该使用
pidof
,而不是改造牦牛棚

结果是脚本本身工作正常,尽管使用pgrep的变化要好得多。问题实际上出现在crontab中(命令中没有包含sh)

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

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

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