【问题标题】:make redis server ignore Ctrl+C when launched from shell script从 shell 脚本启动时使 redis 服务器忽略 Ctrl+C
【发布时间】:2017-06-15 05:11:19
【问题描述】:

我想用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忽略这个信号。

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

【问题讨论】:

  • 无法重现您所看到的行为。你在什么操作系统上?什么版本的 Redis?
  • @Jack,我使用的是 Ubuntu 12.04.5 和 Redis 3.2.9
  • 一种解决方法可能是以setsid ~/redis/src/redis-server &运行它
  • @MarkPlotnick 很好的解决方案,谢谢!

标签: linux bash shell redis


【解决方案1】:

redis-server 捕获 SIGINT (Ctrl+C),即使 SIGINT 被忽略。这是一个不寻常的选择;如果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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-18
    • 1970-01-01
    • 2017-02-10
    • 2012-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多