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

Linux 使redis服务器在从shell脚本启动时忽略Ctrl+C,linux,bash,shell,redis,Linux,Bash,Shell,Redis,我想使用shell脚本启动Redis server,然后监视日志文件: #!/bin/bash /path/to/redis/src/redis-server & tail -f /path/to/log/logfile.log 如果我运行这个脚本并从终端按Ctrl+C,尾部-f终止,这就是我想要的,但是Redis也检测到SIGINT并退出 我试着这样写剧本: #!/bin/bash trap '' INT TSTP ~/redis/src/redis-server &

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

#!/bin/bash
/path/to/redis/src/redis-server &
tail -f /path/to/log/logfile.log
如果我运行这个脚本并从终端按Ctrl+C,尾部-f终止,这就是我想要的,但是Redis也检测到SIGINT并退出

我试着这样写剧本:

 #!/bin/bash
 trap '' INT TSTP
 ~/redis/src/redis-server &
 tail -f ./script1
#!/bin/bash
/path/to/redis/src/redis-server &
tail -f /path/to/log/logfile.log
这一次情况更糟,tail-f拒绝终止,而Redis仍然检测到SIGINT并退出

似乎Redis在忽略信号方面存在一些特定的问题

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

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

即使忽略了SIGINT,redis服务器也会捕获SIGINT Ctrl+C。这是一个不寻常的选择;大多数软件都会进行检查,如果SIGINT已经被忽略,则不会捕获它

当它收到SIGINT时,它保存数据库并关闭

如果选择,它将根本不会与任何终端相关联,也不会看到您键入的任何Ctrl+C

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

$ /path/to/redis/src/redis-server &
shell将把它放入一个进程组,该进程组与终端的进程组不同,键入Ctrl+C不会影响它。如果使用fg将其置于前台,Ctrl+C将向程序发送SIGINT

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

 #!/bin/bash
 trap '' INT TSTP
 ~/redis/src/redis-server &
 tail -f ./script1
#!/bin/bash
/path/to/redis/src/redis-server &
tail -f /path/to/log/logfile.log
运行脚本的shell将是非交互式的,它在后台启动的任何程序都将与shell位于同一进程组中。因此,如果在前台运行shell脚本,键入Ctrl+C将向shell、redis服务器和tail发送SIGINT

在这种情况下,为了防止Ctrl+C向redis服务器发送SIGINT,您需要将redis服务器放在其自己的进程组中,或者将其与终端断开关联。您可以使用来执行此操作,它可以同时执行以下两项操作:

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

无法复制您看到的行为。你在用什么操作系统?什么版本的Redis?@Jack,我使用的是Ubuntu 12.04.5和Redis 3.2.9A解决方案可能是将其作为setsid~/Redis/src/Redis服务器和@MarkPlotnick运行,非常好的解决方案,谢谢!