我正在学习一个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信号之外的任何信号。关于如何使这项工作的任何想法?
答案 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”。