feat(service): implement PID-file based service management (DAW/furt#100)
- Replace unreliable pexp patterns with PID-file approach - Add graceful shutdown with timeout handling in rc.d script - Implement process validation after startup - Add SIGHUP config reload support for Unix services - Ensure PID-file cleanup on service exit - Update systemd service to use PIDFile parameter Platform improvements: - OpenBSD: rc_check/rc_stop functions now PID-file based - Linux: systemd Type=forking with proper PIDFile support - Cross-platform: /var/run/furt.pid standard location Resolves service status detection issues where rcctl check showed (failed) despite running service due to process name variations across platforms.
This commit is contained in:
parent
ddbb232de2
commit
25a709ebbe
3 changed files with 75 additions and 5 deletions
|
|
@ -3,11 +3,52 @@
|
|||
daemon="/usr/local/share/furt/scripts/start.sh"
|
||||
daemon_user="_furt"
|
||||
daemon_cwd="/usr/local/share/furt"
|
||||
daemon_flags="start"
|
||||
|
||||
. /etc/rc.d/rc.subr
|
||||
|
||||
pexp="lua.*src/main.lua"
|
||||
# PID-File location
|
||||
pidfile="/var/run/furt.pid"
|
||||
|
||||
# Custom rc_check function (PID-File based)
|
||||
rc_check() {
|
||||
[ -f "$pidfile" ] && kill -0 $(cat "$pidfile") 2>/dev/null
|
||||
}
|
||||
|
||||
# Custom rc_stop function (PID-File based)
|
||||
rc_stop() {
|
||||
if [ -f "$pidfile" ]; then
|
||||
local _pid=$(cat "$pidfile")
|
||||
echo "Stopping furt (PID: $_pid)"
|
||||
kill "$_pid" 2>/dev/null
|
||||
# Wait for process to die
|
||||
local _timeout=10
|
||||
while [ $_timeout -gt 0 ] && kill -0 "$_pid" 2>/dev/null; do
|
||||
sleep 1
|
||||
_timeout=$((_timeout - 1))
|
||||
done
|
||||
# Force kill if still running
|
||||
if kill -0 "$_pid" 2>/dev/null; then
|
||||
echo "Force killing furt (PID: $_pid)"
|
||||
kill -9 "$_pid" 2>/dev/null
|
||||
fi
|
||||
rm -f "$pidfile"
|
||||
echo "furt stopped"
|
||||
else
|
||||
echo "furt not running (no PID-File)"
|
||||
fi
|
||||
}
|
||||
|
||||
# Custom rc_reload function (signal-based)
|
||||
rc_reload() {
|
||||
if rc_check; then
|
||||
local _pid=$(cat "$pidfile")
|
||||
echo "Reloading furt configuration (PID: $_pid)"
|
||||
kill -HUP "$_pid"
|
||||
else
|
||||
echo "furt not running"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
rc_cmd $1
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue