BASH - 停止执行源脚本

时间:2012-10-13 18:39:51

标签: bash

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

 #!/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

如果其中一个脚本运行了无限循环,是否有办法停止此循环并继续执行主脚本?

3 个答案:

答案 0 :(得分: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个脚本:

script.1.sh:

echo "hello world"

script.2.sh:

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

script.3.sh:

echo "hello world"
echo "hello world"

script.3.sh和script.2.sh之间没有功能差异。没有。他们都将使用一个shell进程(echo是内置的)并将一个接一个地调用echo“hello world”。

script4.sh:

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

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

答案 1 :(得分:0)

脚本不是一个进程,它只是由shell解释(它可能会产生其他进程)。因为它不是一个过程,所以它不会被分配pid,这意味着你无法杀死它。您可以杀死的是由其他脚本启动的进程。例如,如果script1.sh开始wget下载,则可以杀死wget进程(在任何情况下你都需要它的pid,以确保你需要杀死它)

答案 2 :(得分: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%自信的文件。

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

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