从shell脚本启动时,使redis服务器忽略Ctrl + C.

时间:2017-06-10 14:58:56

标签: linux bash shell redis

我想使用shell脚本启动Redis服务器,然后监视日志文件:

#!/bin/bash
/path/to/redis/src/redis-server &
tail -f /path/to/log/logfile.log

如果我运行此脚本并从终端按Ctrl + C,tail -f终止,这就是我想要的,但Redis也检测到SIGINT并退出。

我试着像这样编写脚本:

 #!/bin/bash
 trap '' INT TSTP
 ~/redis/src/redis-server &
 tail -f ./script1

这次事情变得更糟,tail -f拒绝终止,而Redis 仍然检测到SIGINT并退出。

似乎Redis特别关注忽略信号的问题。

我的目标是让tail -f响应Ctrl + C,同时让Redis忽略此信号。

请有人告诉我这是否可以实现,如果是,请给我一些建议吗?

1 个答案:

答案 0 :(得分:1)

即使redis-server被忽略,

SIGINT也会抓住SIGINT Ctrl + C )。这是一个不寻常的选择;大多数软件都会检查,如果它已被忽略,则不会捕获SIGINT

收到SIGINT后,会保存数据库并关闭。

如果你start it as a service,它根本不会与任何终端关联,也不会看到你键入的任何 Ctrl + C

如果您在交互式shell中将其作为后台作业启动:

$ /path/to/redis/src/redis-server &

你的shell会把它放到一个与终端进程组不同的进程组中,输入 Ctrl + C 不会影响它。 (如果使用fg将其带到前台, Ctrl + C 会将SIGINT发送到程序中。

但是,当你运行这样的脚本时:

#!/bin/bash
/path/to/redis/src/redis-server &
tail -f /path/to/log/logfile.log

运行脚本的shell将是非交互式的,并且它在后台启动的任何程序(使用&)将与shell位于同一进程组中。因此,如果您在前台运行该shell脚本,则键入 Ctrl + C 会将SIGINT发送到shell,redis-servertail

要阻止 Ctrl + C 在这种情况下将SIGINT发送到redis-server,您需要将redis-server放入其自己的流程组或取消它与您的终端的关联。您可以使用setsid执行此操作,同时执行这两项操作:

#!/bin/bash
setsid /path/to/redis/src/redis-server &
tail -f /path/to/log/logfile.log