这是一种很难搜索的问题!
我有一个 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
因为,句法上,&
行为类似于;
。 (是的,当然,我知道他们是语义上不同的。)