Skip to content

Commit d8f694d

Browse files
committed
fix: ProxySQL start/stop scripts handle daemonization correctly
- Start script waits for ProxySQL's own PID file instead of tracking shell background PID (ProxySQL forks when daemonizing) - Stop script uses pkill -f to kill child processes matching the config file path, preventing stale processes after stop - Added sleep after PID detection for admin port readiness
1 parent 5a0c00b commit d8f694d

1 file changed

Lines changed: 9 additions & 6 deletions

File tree

providers/proxysql/proxysql.go

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -98,13 +98,16 @@ func (p *ProxySQLProvider) CreateSandbox(config providers.SandboxConfig) (*provi
9898
}
9999

100100
// Write lifecycle scripts
101+
// ProxySQL daemonizes by default — it forks and the parent exits.
102+
// We use ProxySQL's own PID file (written to datadir/proxysql.pid) to track the process.
103+
pidFile := filepath.Join(dataDir, "proxysql.pid")
101104
scripts := map[string]string{
102-
"start": fmt.Sprintf("#!/bin/bash\ncd %s\n%s --initial -c %s -D %s &\nSBPID=$!\necho $SBPID > %s/proxysql.pid\nsleep 2\nif kill -0 $SBPID 2>/dev/null; then\n echo 'ProxySQL started (pid '$SBPID')'\nelse\n echo 'ProxySQL failed to start'\n exit 1\nfi\n",
103-
config.Dir, binaryPath, cfgPath, dataDir, config.Dir),
104-
"stop": fmt.Sprintf("#!/bin/bash\nPIDFILE=%s/proxysql.pid\nif [ -f $PIDFILE ]; then\n PID=$(cat $PIDFILE)\n kill $PID 2>/dev/null\n sleep 1\n kill -0 $PID 2>/dev/null && kill -9 $PID 2>/dev/null\n rm -f $PIDFILE\n echo 'ProxySQL stopped'\nelse\n echo 'ProxySQL not running (no pid file)'\nfi\n",
105-
config.Dir),
106-
"status": fmt.Sprintf("#!/bin/bash\nPIDFILE=%s/proxysql.pid\nif [ -f $PIDFILE ] && kill -0 $(cat $PIDFILE) 2>/dev/null; then\n echo 'ProxySQL running (pid '$(cat $PIDFILE)')'\nelse\n echo 'ProxySQL not running'\n exit 1\nfi\n",
107-
config.Dir),
105+
"start": fmt.Sprintf("#!/bin/bash\ncd %s\n%s --initial -c %s -D %s 2>&1 | grep -v '^profiling:' || true\n# ProxySQL daemonizes — wait for PID file\nfor i in $(seq 1 10); do\n if [ -f %s ]; then\n PID=$(cat %s)\n if kill -0 $PID 2>/dev/null; then\n sleep 2\n echo \"ProxySQL started (pid $PID)\"\n exit 0\n fi\n fi\n sleep 1\ndone\necho 'ProxySQL failed to start'\nexit 1\n",
106+
config.Dir, binaryPath, cfgPath, dataDir, pidFile, pidFile),
107+
"stop": fmt.Sprintf("#!/bin/bash\nPIDFILE=%s\nCONFIG=%s\nif [ -f $PIDFILE ]; then\n PID=$(cat $PIDFILE)\n # Kill main process and any children matching our config\n kill $PID 2>/dev/null\n pkill -f \"proxysql.*$CONFIG\" 2>/dev/null\n for i in $(seq 1 5); do\n kill -0 $PID 2>/dev/null || break\n sleep 1\n done\n kill -0 $PID 2>/dev/null && kill -9 $PID 2>/dev/null\n pkill -9 -f \"proxysql.*$CONFIG\" 2>/dev/null\n rm -f $PIDFILE\n echo 'ProxySQL stopped'\nelse\n # Try to find and kill by config file pattern\n pkill -f \"proxysql.*$CONFIG\" 2>/dev/null\n echo 'ProxySQL stopped (no pid file)'\nfi\n",
108+
pidFile, cfgPath),
109+
"status": fmt.Sprintf("#!/bin/bash\nPIDFILE=%s\nif [ -f $PIDFILE ] && kill -0 $(cat $PIDFILE) 2>/dev/null; then\n echo \"ProxySQL running (pid $(cat $PIDFILE))\"\nelse\n echo 'ProxySQL not running'\n exit 1\nfi\n",
110+
pidFile),
108111
"use": fmt.Sprintf("#!/bin/bash\nmysql -h %s -P %d -u %s -p%s --prompt 'ProxySQL Admin> ' \"$@\"\n",
109112
host, adminPort, adminUser, adminPassword),
110113
"use_proxy": fmt.Sprintf("#!/bin/bash\nmysql -h %s -P %d -u %s -p%s --prompt 'ProxySQL> ' \"$@\"\n",

0 commit comments

Comments
 (0)