其他 求助, 有关 Bash Shell script

zw963 · 2012年03月23日 · 最后由 zw963 回复于 2012年04月21日 · 4266 次阅读

希望实现以下功能:

简单点说:

command1& && command2 , 这种方式如何实现?

同时兼顾

  • command1 在后台运行,所以必须加&
  • command2 等待 command1 执行完毕后,再运行。

我现在的做法是先启动第一个 daemon, 然后等待五秒钟以后,然后查询 daemon 端口是否激活,激活的话,才启动第二个。我就是想知道,有没有不用 sleep 的办法,自动找到这个时间点。

除了丑陋的 sleep 方式 (目前我就是这样实现的), 还有没有其他办法?

匿名 #1 2012年03月23日

可以通过 ps 去扫描,看看你那个 daemon 程序是否已经启动成功。然后再去启动另外一个程序。

bash 不会。用 c 搞很简单。

如果是你说的这样: "前台这个程序,要求必须等待那个 daemon 运行完成才可以继续运行"

那么

./daemon ; ./another

就可以了

#3 楼 @liuhui998 #1 楼 @imsoz

你们没有明白我的意思. 这样说吧,我现在要这样: ./.daemon& ; /another , 而且后者必须在前者作为后台启动成功之后,再启动。

匿名 #5 2012年03月23日

#4 楼 @zw963 daemon 进程启动完成之后,应该会有一些特征的吧。比如 httpd 启动完成,你可以通过 curl 正常访问他的页面。当可以正常访问其页面,就可以接着启动另外一个进程了。

#5 楼 @imsoz

呵呵,我还是没讲清楚,当然有特征了。 例如,开启了某个端口,这个可以判断。

现在的问题是:我没有启动 daemon 的情况下,如何用批处理同时启动这两个?

我现在的做法就是先启动第一个 daemon, 然后等待五秒钟以后,然后查询端口是否激活,激活的话,才启动第二个。我就是想知道,有没有不用 sleep 的办法,自动找到这个时间点. 因为 5 秒一点都不保险。

匿名 #7 2012年03月23日

#6 楼 @zw963 呵呵,我也差不多的想法,只是在一个循环中 sleep,然后看端口是否在 listen,如果不是,就继续循环。

一个比较复杂的方案,Inotify 监控上一个程序创建一个文件

或许 wait 可以满足你的要求

(cmd1 && cmd2) &

command1& 运行后,通过$?来获得状态码再决定是否执行第二个

既然是批处理,那么下一个指令会等上一个指令处理完成再执行。 判断第一个指令是否执行成功可以用这个方法: echo $? 欲知后事如何,请点我

#11 楼 @minix 我就是这样做的。只不过,你该什么时候去获取$?的值?有没有一个点来判断,"嗨,现在可以试试了,看看$?正常了没有!"

#9 楼 @qisine

wait 怎么用?你说的是不是 sleep ?

#10 楼 @lululau

你这个我之前没想到,用 bash 这么久,还没这么用过。哈哈

虽然初衷是我不想第二个命令&方式运行,因为第二个命令是 autotest. 不过这个方法应该是可行的。

[690]user@host:~$ cat /tmp/long_running_task sleep 10; echo "task done!" [691]user@host:~$ !$ & /tmp/long_running_task & [1] 3108 [692]user@host:~$ wait 3108 task done! [1]+ Done /tmp/long_running_task [693]user@host:~$ echo $? 0

可是估计 lululau 的方法更好

#16 楼 @qisine 谢谢了~~ 靠~ 直到你发这个贴,我才明白 wait 的含义。之前以为是类似于 sleep.

通过 wait 应该可以实现的,我稍后试试啊

需要 登录 后方可回复, 如果你还没有账号请 注册新账号