5

我有一个这样的 bash 脚本:

#!/bin/bash
startsomeservice &
echo $! > service.pid

while true; do
    # dosomething in repeat all the time here
    foo bar
    sleep 5
done

# cleanup stuff on abort here
rm tmpfiles
kill $(cat service.pid)

这个脚本的问题是,我不能中止它。如果我按 ctrl+ci 进入下一个循环......是否可以运行这样的脚本但让它中止?

4

4 回答 4

6

由于您使用 Bash 执行脚本,因此可以执行以下操作:

#!/bin/bash

startsomeservice &
echo $! > service.pid

finish()
{
    rm tmpfiles
    kill $(cat service.pid)
    exit
}
trap finish SIGINT

while :; do
    foo bar
    sleep 5
done

请注意,此行为是 Bash 特定的,例如,如果您使用 Dash 运行它,您将看到两个不同之处:

  1. 你无法捕捉SIGINT
  2. 中断信号将中断 shell 循环。

另请注意,C-c当您直接从交互式提示符执行循环时,即使您正在运行 Bash,也会用一个循环来中断 shell 循环。请参阅有关从 shell 处理的详细讨论。SIGINT

于 2012-06-12T09:34:44.087 回答
2

以下 bash 脚本将继续运行,直到收到终止信号。陷阱命令负责处理 SIGINT。

#!/bin/bash

keepgoing=1
trap '{ echo "sigint"; keepgoing=0; }' SIGINT

while (( keepgoing )); do
    echo "sleeping"
    sleep 5
done
于 2012-06-12T09:32:26.120 回答
0

我会使用:

tail -f /var/log/apache2/error.log & wait ${!}

在脚本的最后,我认为 sleep 会导致延迟信号处理,但这一行会立即响应。

于 2017-08-15T02:50:03.690 回答
0

您还可以通过以下简单的方式完成任务:

#!/bin/bash

startsomeservice &

read # wait for user input

finish
于 2020-11-26T13:41:15.963 回答