diff --git a/vminitd/Sources/vminitd/ManagedContainer.swift b/vminitd/Sources/vminitd/ManagedContainer.swift index ceba352e..013e9a93 100644 --- a/vminitd/Sources/vminitd/ManagedContainer.swift +++ b/vminitd/Sources/vminitd/ManagedContainer.swift @@ -30,7 +30,7 @@ actor ManagedContainer { private let bundle: ContainerizationOCI.Bundle private var execs: [String: ManagedProcess] = [:] - var pid: Int32 { + var pid: Int32? { self.initProcess.pid } diff --git a/vminitd/Sources/vminitd/ManagedProcess.swift b/vminitd/Sources/vminitd/ManagedProcess.swift index 8f55f455..965d1205 100644 --- a/vminitd/Sources/vminitd/ManagedProcess.swift +++ b/vminitd/Sources/vminitd/ManagedProcess.swift @@ -49,7 +49,7 @@ final class ManagedProcess: Sendable { let io: IO var waiters: [CheckedContinuation] = [] var exitStatus: ExitStatus? = nil - var pid: Int32 = 0 + var pid: Int32? } private static let ackPid = "AckPid" @@ -67,7 +67,7 @@ final class ManagedProcess: Sendable { private let bundle: ContainerizationOCI.Bundle private let cgroupManager: Cgroup2Manager? - var pid: Int32 { + var pid: Int32? { self.state.withLock { $0.pid } @@ -286,12 +286,16 @@ extension ManagedProcess { func kill(_ signal: Int32) throws { try self.state.withLock { + guard let pid = $0.pid else { + throw ContainerizationError(.invalidState, message: "process PID is required") + } + guard $0.exitStatus == nil else { return } - self.log.info("sending signal \(signal) to process \($0.pid)") - guard Foundation.kill($0.pid, signal) == 0 else { + self.log.info("sending signal \(signal) to process \(pid)") + guard Foundation.kill(pid, signal) == 0 else { throw POSIXError.fromErrno() } } diff --git a/vminitd/Sources/vminitd/ProcessSupervisor.swift b/vminitd/Sources/vminitd/ProcessSupervisor.swift index 1c79890e..a0a70929 100644 --- a/vminitd/Sources/vminitd/ProcessSupervisor.swift +++ b/vminitd/Sources/vminitd/ProcessSupervisor.swift @@ -80,8 +80,7 @@ actor ProcessSupervisor { } for proc in exitedProcesses { - let pid = proc.pid - if pid <= 0 { + guard let pid = proc.pid else { continue }