我想使用 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
在使 Redis 忽略此信号的同时响应 Ctrl+C。
请任何人告诉我这是否可以实现,如果可以,请给我一些建议?
redis-server
捕获SIGINT
( Ctrl+C),即使SIGINT
被忽略。这是一个不寻常的选择;SIGINT
如果它已经被忽略,大多数软件都会检查并且不会捕获。
当它收到时SIGINT
,它保存数据库并关闭。
如果您将其作为服务启动,则它根本不会与任何终端关联,也不会看到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、 toredis-server
和 to 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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句