如何同时运行多个bash脚本?

时间:2013-01-25 22:34:42

标签: bash unix

我正在学习一个Unix类的Bash,我正在试图找出如何运行一个脚本,然后在第一个脚本运行时运行第二个脚本并让两个脚本进行交互。为了澄清,脚本如下所示:

#!/bin/bash

num = 1
trap exit 0 SIGINT SIGTERM
trap "{ echo &num ; num++; }" SIGUSR1

while :
do
    sleep 2
done

和第二个:

#!/bin/bash

if ps | grep "$1" > /dev/null
then
    kill -SIGUSR1 $1
else
    echo "Process doesn't exist"
fi

exit 0

如果代码不正确,一般的想法是第一个脚本循环,直到它收到SIGINT或SIGTERM,并在收到SIGUSR1时回显并递增一个数字。第二个脚本将pid作为参数并检查它是否存在,并将SIGUSR1发送到给定进程。问题是,当我运行第一个脚本时,除非用ctrl-z将它移动到后台,否则我什么都做不了,但是当它在那里时它似乎没有响应除了kill信号之外的任何信号。关于如何使这项工作的任何想法?

2 个答案:

答案 0 :(得分:3)

您可以使用mycommand &在后​​台运行脚本。 Ctrl-Z会停止脚本,但您可以使用bg让它在后台运行。在任何一种情况下,您都可以使用fg将其重新置于前台。

另请注意,分配中=周围不能有空格,您可以使用let num++增加num。您还应该在trap中单击该命令,以防止“$ num”扩展。

总而言之:

#!/bin/bash

num=1
trap exit 0 SIGINT SIGTERM
trap '{ echo $num ; let num++; }' SIGUSR1

while :
do
    sleep 2
done

最后,您可以通过仅使用kill -0 pid或仅尝试sigusr1并检查结果来更轻松地检查pid是否存在,以避免grep“123”匹配pid“1234”的子字符串等。

答案 1 :(得分:1)

您需要在后台运行第一个脚本。当您按Ctrl + Z时,它会被暂停。然后你可以输入“bg”使它在后台运行(如果它试图从标准输入读取它会再次停止,允许你用“fg”命令切换回它)。

另一种方法是在后台启动script1,如下所示:

$ ./script1 &

&符号在后台启动作业并立即返回提示符。

查看“作业控制”(here's副本)下的bash手册页,了解有关其工作原理的更多信息。处理交互式shell中作业的关键命令是“jobs”,“fg”和“bg”。