@@ -188,6 +188,13 @@ func main() {
188188 return
189189 }
190190
191+ // resident 子命令: 以常驻模式启动(挂 CFS 根, 面向 apiserver 提供 PV 文件操作)。
192+ // 与 version 同构, 靠 os.Args[1] 特判, 不影响现有沙箱 daemon 的 entrypoint 拉起逻辑。
193+ if len (os .Args ) > 1 && os .Args [1 ] == "resident" {
194+ runResident ()
195+ return
196+ }
197+
191198 errChan := make (chan error )
192199
193200 cfg , err := config .Load ()
@@ -269,6 +276,41 @@ func main() {
269276 slog .Info ("Shutdown complete" )
270277}
271278
279+ // runResident starts the daemon in resident mode.
280+ //
281+ // It shares the common bootstrap (config + logging + signal-driven graceful shutdown)
282+ // with the sandbox mode but does NOT manage an entrypoint child process: the resident
283+ // daemon is a standalone platform component that only serves PV file operations over HTTP.
284+ func runResident () {
285+ cfg , err := config .Load ()
286+ if err != nil {
287+ slog .Error ("Failed to load config" , "error" , err )
288+ panic (err )
289+ }
290+
291+ var logWriter io.Writer
292+ logFile , err := os .OpenFile (cfg .DaemonLogFilePath , os .O_APPEND | os .O_CREATE | os .O_WRONLY , 0o644 )
293+ if err != nil {
294+ slog .Error ("Failed to open log file" , "path" , cfg .DaemonLogFilePath , "error" , err )
295+ } else {
296+ defer logFile .Close () // nolint
297+ logWriter = logFile
298+ }
299+ initLogs (logWriter )
300+
301+ slog .Info ("Starting resident daemon" , "cfsRoot" , cfg .CFSRoot )
302+
303+ ctx , stop := signal .NotifyContext (context .Background (), syscall .SIGINT , syscall .SIGTERM )
304+ defer stop ()
305+
306+ if err := server .StartResident (ctx ); err != nil {
307+ slog .Error ("Resident server error" , "error" , err )
308+ os .Exit (1 )
309+ }
310+
311+ slog .Info ("Resident daemon shutdown complete" )
312+ }
313+
272314func initLogs (logWriter io.Writer ) {
273315 logLevel := config .ParseLogLevel (config .G .LogLevel )
274316 handler := config .NewMultiWriterHandler (logLevel , os .Stdout , logWriter )
0 commit comments