在我的 Ubuntu 机器上,我有鱿鱼3作为启动时启动的守护进程。
问题是鱿鱼3启动和停止需要很长时间(超过 30 秒),并且还大大减慢了我的操作系统启动/关闭时间。
我该如何解决这个问题?
答案1
有一个名为shutdown_lifetime的参数。它的默认值是30秒。
因此,当 Squid 收到关闭请求时,它会等待至少 30 秒才终止。
$ grep -B 8 "# shutdown_lifetime" /etc/squid3/squid.conf
# TAG: shutdown_lifetime time-units
# When SIGTERM or SIGHUP is received, the cache is put into
# "shutdown pending" mode until all active sockets are closed.
# This value is the lifetime to set for all open descriptors
# during shutdown mode. Any active clients after this many
# seconds will receive a 'timeout' message.
# Default:
# shutdown_lifetime 30 seconds
只需“取消注释”最后一行并设置更短的时间:
shutdown_lifetime 10 seconds
更多信息请参见下文。
答案2
我为 Debian Wheezy 的 Squid 3.1.20-2.2 包找到了这个。
$ vim /etc/init.d/squid3
...
78
79 stop () {
80 PID=`cat $PIDFILE 2>/dev/null`
81 start-stop-daemon --stop --quiet --pidfile $PIDFILE --exec $DAEMON
82 #
83 # Now we have to wait until squid has _really_ stopped.
84 #
85 sleep 2
86 if test -n "$PID" && kill -0 $PID 2>/dev/null
87 then
88 log_action_begin_msg " Waiting"
89 cnt=0
90 while kill -0 $PID 2>/dev/null
91 do
92 cnt=`expr $cnt + 1`
93 if [ $cnt -gt 24 ]
94 then
95 log_action_end_msg 1
96 return 1
97 fi
98 sleep 5
99 log_action_cont_msg ""
100 done
101 log_action_end_msg 0
102 return 0
103 else
104 return 0
105 fi
106 }
107...
,该函数正在使用此无法识别的信号 (0)。
解决方法:在第 90 行,将信号更改为 SIGTERM 信号,例如 15。
90 while kill -15 $PID 2>/dev/null
然后,启动/停止 Squid 时将不会有任何延迟:
$ time /etc/init.d/squid3 stop
[ ok ] Stopping Squid HTTP Proxy 3.x: squid3.
real 0m2.036s
user 0m0.004s
sys 0m0.000s
$ time /etc/init.d/squid3 start
[ ok ] Starting Squid HTTP Proxy 3.x: squid3.
real 0m0.036s
user 0m0.004s
sys 0m0.004s
谨防:虽然它为服务提供了快速启动/停止,但是这种解决方法可能会破坏脚本的目的,因为脚本出于自身的原因使用信号 0。