2

我正在为 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 将它移到后台,否则我什么都做不了,但是当它在那里时,它似乎除了终止信号之外没有响应任何信号。关于如何使这项工作的任何想法?

4

2 回答 2

3

您可以使用mycommand &在后台运行脚本。Ctrl-Z停止脚本,但您可以使用bg它让它在后台运行。在任何一种情况下,您都可以使用fg它再次将其带到前台。

另请注意,=in 分配周围不能有空格,您可以使用它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

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

于 2013-01-25T22:51:40.063 回答
1

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

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

$ ./script1 &

& 符号在后台启动一项工作,并立即将您返回到提示符。

查看“JOB CONTROL”下的 bash 手册页(这里有一份副本)以获取有关其工作原理的更多信息。从交互式 shell 处理作业的关键命令是“jobs”、“fg”和“bg”。

于 2013-01-25T22:51:46.387 回答