mirror of
https://github.com/sipeed/picoclaw.git
synced 2026-06-12 18:08:54 +00:00
fix: treat PID=1 as stale in PID file singleton check, fix govet shadow, add .gitattributes (#2642)
- pid: When a container stops and leaves behind a PID file with PID 1 on a shared volume, the host's init process (PID 1) passes the isProcessRunning check, blocking new gateway starts. Treat recorded PID 1 as always stale in both WritePidFile and ReadPidFileWithCheck. Added unit tests covering the PID=1 container leftover scenario. - isolation: Fix govet shadow warning on platform_windows.go line 105 where := shadows the outer err variable. Changed to = assignment. - gitattributes: Enforce LF line endings for shell scripts to prevent CRLF issues when checking out on Windows (breaks Docker entrypoint). Co-authored-by: BeaconCat <BeaconCat@users.noreply.github.com>
This commit is contained in:
+14
-1
@@ -58,7 +58,12 @@ func WritePidFile(homePath, host string, port int) (*PidFileData, error) {
|
||||
if data, err := readPidFileUnlocked(pidPath); err == nil {
|
||||
if os.Getpid() != data.PID {
|
||||
logger.Infof("found pid file (PID: %d, version: %s)", data.PID, data.Version)
|
||||
if isProcessRunning(data.PID) {
|
||||
// PID 1 is typically init/systemd on the host or the entrypoint
|
||||
// inside a container. When a container stops and leaves behind a
|
||||
// PID file on a shared volume, the host's PID 1 (init) would
|
||||
// pass the isProcessRunning check, blocking new gateway starts.
|
||||
// Treat recorded PID 1 as always stale.
|
||||
if data.PID != 1 && isProcessRunning(data.PID) {
|
||||
return nil, fmt.Errorf("gateway is already running (PID: %d, version: %s)", data.PID, data.Version)
|
||||
}
|
||||
logger.Warnf("not running (PID: %d) so will remove the pid file: %s", data.PID, pidPath)
|
||||
@@ -124,6 +129,14 @@ func ReadPidFileWithCheck(homePath string) *PidFileData {
|
||||
return nil
|
||||
}
|
||||
|
||||
// Treat PID 1 as stale when we are not PID 1 ourselves (container
|
||||
// leftover on a shared volume — host PID 1 is init, not gateway).
|
||||
if data.PID == 1 && os.Getpid() != 1 {
|
||||
logger.Debugf("stale container PID 1, remove pid file: %s", pidPath)
|
||||
os.Remove(pidPath)
|
||||
return nil
|
||||
}
|
||||
|
||||
if !isProcessRunning(data.PID) {
|
||||
logger.Debugf("process not running, remove pid file: %s", pidPath)
|
||||
os.Remove(pidPath)
|
||||
|
||||
Reference in New Issue
Block a user