0

我有一个脚本可以使用源代码运行其他脚本。我想要做的是找到正在运行的那些脚本,如果它们中的任何一个正在运行,则停止执行它。像这样的东西:

 #!/bin/bash

 source /path/script1.sh
 source /path/sript2.sh
 source /path/sript3.sh

 if [ a_script_is_running ]
 then
      stop_execution scriptn.sh
 fi

如果其中一个脚本正在运行无限循环,有没有办法停止这个循环并继续执行主脚本?

4

3 回答 3

1

您正在寻找的是背景壳以及如何杀死它们。

第一步是将这些脚本分叉到后台而不是采购它们。采购他们只是将他们的代码插入到您当前的脚本中。

因此,您可以执行以下操作:

# '&' forks a script into the background
/path/script1.sh &
/path/script2.sh &
/path/script3.sh &
...
# now when you need to make sure that they are all killed
kill $(jobs -p)

的解释source

如果我有 3 个脚本:

脚本.1.sh:

echo "hello world"

脚本.2.sh:

source script.1.sh
source script.1.sh

脚本.3.sh:

echo "hello world"
echo "hello world"

script.3.sh 和 script.2.sh 在功能上没有区别。没有任何。他们都将使用一个 shell 进程(echo 是内置的),并且会一个接一个地调用 echo "hello world" 两次。

脚本4.sh:

script.1.sh &
script.1.sh &

这个不同。它分叉了两个后台脚本(都称为 script.1.sh,尽管它们有不同的进程 ID),每个后台进程都会回显“hello world”然后退出。它看起来是一样的,但在这种情况下,您实际上可以杀死其中一个,因为它们是从您的主脚本异步执行的。

于 2012-10-13T18:58:43.830 回答
0

脚本不是进程,它仅由 shell 解释(尽管它可能会产生其他进程)。因为它不是一个进程,所以它不会被分配 a pid,这意味着你不能杀死它。您可以杀死的是由其他脚本启动的进程。例如,如果script1.sh开始wget下载,您可以终止该wget进程(无论如何您都需要它的 pid,以确保您需要终止该进程)

于 2012-10-13T18:50:15.053 回答
0

您的基本前提是问题:

source /path/script1.sh 
source /path/sript2.sh 
source /path/sript3.sh 

                       <- At this point, all those scripts have run to completion

if [ a_script_is_running ]       <- It won't be!
then 
     stop_execution scriptn.sh   <- Too late!  
fi 

在使用它们之前,将源文件作为模块化单元进行测试。永远不要,source你不是 100% 有信心的文件。

您说您不在后台运行它们,因为您需要共享变量:再次查看您的设计。

如果您需要传递数据,请考虑使用命名管道(又名 fifo,请参阅 参考资料man mkfifo)或其他形式的进程间通信。

于 2012-10-13T20:26:48.777 回答