Linux:在另一个完成后启动脚本

时间:2013-12-10 23:24:40

标签: linux shell csh

我从this link阅读了这个问题的答案 在Stackoverflow.com中。但我在编写shell脚本方面是如此新颖,以至于我做错了什么。以下是我的脚本:

testscript:

#!/bin/csh -f
pid=$(ps -opid= -C csh testscript1)
while [ -d /proc/$pid ] ; do
    sleep 1
done && csh testscript2

exit

testscript1:

#!/bin/csh -f
/usr/bin/firefox
exit

testscript2:

#!/bin/csh -f
echo Done
exit

目的是让testscript首先调用testscript1;一旦testscript1已经完成(这意味着在script1中调用的firefox被关闭),testscript将调用testscript2。但是在运行testscript之后我得到了这个结果:

$ csh testscript
Illegal variable name.

请帮我解决这个问题。谢谢。

3 个答案:

答案 0 :(得分:2)

我相信这条线不是CSH:

pid=$(ps -opid= -C csh testscript1)

通常在csh中定义如下变量:

set pid=...

我不确定$()语法是什么,也许回到标记woudl作为替代:

set pid=`ps -opid= -C csh testscript1`

答案 1 :(得分:1)

也许您没有注意到您找到的脚本是为bash编写的,而不是csh,但是 你正试图用csh解释器来处理它们。

看起来你误解了原始代码试图做的事情 - 事实确实如此 旨在通过使用进程名称查找其进程ID来监视已存在的进程。

您似乎正在尝试从ps命令内部启动第一个进程。但 在这种情况下,你不需要做任何如此复杂的事情 - 你需要的一切 是:

#!/bin/csh
csh testscript1
csh testscript2

除非您不遗余力地在后台运行其中一个脚本, 在第一个脚本完成之前,第二个脚本不会运行。

虽然这与你的问题无关,但csh更倾向于 互动使用;对于脚本编写,it's considered a poor choice,所以你可能会 最好还是学习bash。

答案 2 :(得分:0)

尝试,

下面的脚本将检查testscript1的pid,如果找不到则会执行testscirpt2

 sp=$(ps -ef | grep testscript1 | grep -v grep | awk '{print $2}')
 /bin/ls -l /proc/ | grep $sp > /dev/null 2>&1 && sleep 0 || /bin/csh testscript2