& 和 && 怎样组合?

& 和 && 怎样组合?

这是一种很难搜索的问题!

我有一个 shell 脚本,如下所示:

#!/bin/bash
./script.fcgi --socket /tmp/fcgi-socket &
sleep 2
chmod a+w /tmp/fcgi-socket

script.fcgi 是一个长时间运行的程序(守护进程?),我需要附加 & 才能使其在后台运行。除了我累了之外,我还需要睡眠,因为否则脚本没有时间在我可以 chmod 之前设置套接字。

我想要这样的一句台词:

./script.fcgi --socket /tmp/fcgi-socket & && chmod a+w /tmp/fcgi-socket 

但我想这是不可能的。而且我不知道如何让脚本设置具有正确写入权限的套接字(这将是另一个问题)。但我很好奇:我是否遗漏了一些关于组合 & 和 && 的东西,或者真的不可能做我想做的事?

答案1

假设我了解您想要做什么并且您的流程不易分叉,我会做类似的事情:

/long/running/process with args &
LRP_PID=$!
sleep 2
if jobs %% #It's alive!
then 
    chmod a+w ...
fi

(或者kill -0 $LRP_PID代替jobs 1。)

答案2

是的,当然可以:这是语法

 (/absolute/path/to/script/script.fcgi --socket /tmp/fcgi-socket &) && (sleep 2; chmod a+w /tmp/fcgi-socket)

但请记住米克尔的评论,这是正确的。

编辑:

鉴于下面@muru的评论,让我解释一下。 OP 不想在成功完成第一个命令后执行第二个和第三个命令:他明确指出这是一个长时间运行的命令。 OP希望在成功后执行第三个命令开始第一个命令的。上面的一行代码正是这样做的。

编辑2:

在 @muru 的提示下,以下一行代码将检查初始命令启动时是否有错误:

 (/absolute/path/to/script/script.fcgi --socket /tmp/fcgi-socket  2> /path/to/errors.txt &) && (sleep 2; if ! [ -s /path/to/errors.txt]; then chmod a+w /tmp/fcgi-socket; fi)

答案3

如果您不想退出终端,可以这样运行:

./script.fcgi --socket /tmp/fcgi-socket && chmod a+w /tmp/fcgi-socket &

如果您要注销,那么最好在终端多路复用器(如screen或 )下启动脚本tmux

我不是很熟悉tmux,但这就是你可以使用的方法screen

使用命令启动屏幕screen。在新的“屏幕”外壳中,启动:

./script.fcgi --socket /tmp/fcgi-socket && chmod a+w /tmp/fcgi-socket

enter

ctrl + a按 然后按从屏幕分离ctrl + d

返回后您可以使用以下命令连接回屏幕:

screen -r

在屏幕下运行此脚本将在后台运行该脚本。当您重新连接到屏幕时,您将能够连接回该 shell。

答案4

在我看来,很多人都想太多了。足以说

./script.fcgi --socket /tmp/fcgi-socket & sleep 2; chmod a+w /tmp/fcgi-socket

因为,句法上&行为类似于;。 (是的,当然,我知道他们是语义上不同的。)

相关内容