pidfile_windows.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. //go:build windows
  2. /*
  3. Copyright 2023 Docker Compose CLI authors
  4. Licensed under the Apache License, Version 2.0 (the "License");
  5. you may not use this file except in compliance with the License.
  6. You may obtain a copy of the License at
  7. http://www.apache.org/licenses/LICENSE-2.0
  8. Unless required by applicable law or agreed to in writing, software
  9. distributed under the License is distributed on an "AS IS" BASIS,
  10. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  11. See the License for the specific language governing permissions and
  12. limitations under the License.
  13. */
  14. package locker
  15. import (
  16. "github.com/docker/docker/pkg/pidfile"
  17. "github.com/mitchellh/go-ps"
  18. "os"
  19. )
  20. func (f *Pidfile) Lock() error {
  21. newPID := os.Getpid()
  22. err := pidfile.Write(f.path, newPID)
  23. if err != nil {
  24. // Get PID registered in the file
  25. pid, errPid := pidfile.Read(f.path)
  26. if errPid != nil {
  27. return err
  28. }
  29. // Some users faced issues on Windows where the process written in the pidfile was identified as still existing
  30. // So we used a 2nd process library to verify if this not a false positive feedback
  31. // Check if the process exists
  32. process, errPid := ps.FindProcess(pid)
  33. if process == nil && errPid == nil {
  34. // If the process does not exist, remove the pidfile and try to lock again
  35. _ = os.Remove(f.path)
  36. return pidfile.Write(f.path, newPID)
  37. }
  38. }
  39. return err
  40. }