我有一个脚本,可以使用源代码运行其他脚本。我想要做的是找到正在运行的脚本,如果其中任何一个正在运行,则停止执行它。 像这样:
#!/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
如果其中一个脚本运行了无限循环,是否有办法停止此循环并继续执行主脚本?
答案 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
)或其他形式的进程间通信。