我想使用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忽略此信号。
请有人告诉我这是否可以实现,如果是,请给我一些建议吗?
答案 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-server
和tail
。
要阻止 Ctrl + C 在这种情况下将SIGINT
发送到redis-server
,您需要将redis-server
放入其自己的流程组或取消它与您的终端的关联。您可以使用setsid
执行此操作,同时执行这两项操作:
#!/bin/bash
setsid /path/to/redis/src/redis-server &
tail -f /path/to/log/logfile.log