我有一个本质上是阻塞的进程。它首先被执行。为了执行第二个进程,我将第一个进程移动到后台并执行第二个进程。使用 wait 语句,我在终端中等待。然而,似乎退出外壳后(按CTRL+ C),第一个进程并没有顺利退出。下面是 shell 脚本:
执行.sh
#!/bin/sh
# start process one in background
python3 -m http.server 8086 &
# start second process
firefox "http://localhost:8086/index.html"
wait
我发现了一个类似的问题这里但它似乎工作不正常。基本上,当我./execute.sh
第二次拨打电话时,服务器会说“地址已在使用中”。这意味着服务器无法平静退出。另一方面,如果我在终端中手动执行服务器,它会顺利退出。
答案1
您还可以捕获中断,以确保按下 ctrl+c 时进程被终止
#!/bin/sh
trap ctrl_c INT
ctrl_c () {
kill "$bpid"
exit
}
# start process one in background
python3 -m http.server 8086 &
bpid=$!
# start second process
firefox "http://localhost:8086/index.html"
wait
答案2
Firefox 退出后终止 Python 程序。
我的头顶上浮现出:
#!/bin/sh
# start process one in background
python3 -m http.server 8086 &
pid=$!
# start second process
firefox "http://localhost:8086/index.html"
kill "$!"
wait # wait for it to actually exit
# if it ignores SIGTERM, this'll hang
或者,由于从脚本启动的 Firefox 进程实际上并不在前台运行(但可能只是向现有firefox
进程发出打开新窗口的信号),因此这是行不通的。
但我们可以等待用户的输入:
#!/bin/sh
# start process one in background
python3 -m http.server 8086 &
pid=$!
# start second process
firefox "http://localhost:8086/index.html"
echo "Started Python HTTP server"
echo "Press enter to close it"
read tmp
echo "Asking the Python HTTP server to terminate"
kill "$!"
wait # wait for it to actually exit
# if it ignores SIGTERM, this'll hang
echo "Done."
另一种解决方案是在 Python HTTP 服务器中实现空闲计时器。让它每 N 分钟醒来一次,看看自上次收到请求以来是否已经过了 M 分钟或更长时间,如果是,则退出。只是不要让 M 太短,否则当你短暂休息时它会死掉。