diff --git a/internal/server/instance/drivers/driver_common.go b/internal/server/instance/drivers/driver_common.go index e3709f67eed..38156c523b0 100644 --- a/internal/server/instance/drivers/driver_common.go +++ b/internal/server/instance/drivers/driver_common.go @@ -12,6 +12,8 @@ import ( "strings" "sync" "time" + "os" + "syscall" "github.com/google/uuid" @@ -1521,3 +1523,14 @@ func (d *common) setNUMANode() error { return d.VolatileSet(map[string]string{"volatile.cpu.nodes": fmt.Sprintf("%d", node)}) } + +// Gets the time the instance was started at +func (d *common) StartedAt(pid int) (time.Time, error) { + file, err := os.Stat(fmt.Sprintf("/proc/%d", pid)) + if err != nil { + return time.Time{}, err + } + + linuxInfo := file.Sys().(*syscall.Stat_t) + return time.Unix(linuxInfo.Ctim.Sec, linuxInfo.Ctim.Nsec), nil +} diff --git a/internal/server/instance/drivers/driver_lxc.go b/internal/server/instance/drivers/driver_lxc.go index 79ea209a8d6..6e297e95e89 100644 --- a/internal/server/instance/drivers/driver_lxc.go +++ b/internal/server/instance/drivers/driver_lxc.go @@ -35,7 +35,7 @@ import ( "golang.org/x/sys/unix" "google.golang.org/protobuf/proto" yaml "gopkg.in/yaml.v2" - + internalInstance "github.com/lxc/incus/v6/internal/instance" "github.com/lxc/incus/v6/internal/instancewriter" internalIO "github.com/lxc/incus/v6/internal/io" @@ -3411,6 +3411,7 @@ func (d *lxc) renderState(statusCode api.StatusCode, hostInterfaces []net.Interf status.Network = d.networkState(hostInterfaces) status.Pid = int64(pid) status.Processes = processesState + status.StartedAt, _ = d.StartedAt(d.InitPID()) } status.Disk = d.diskState() diff --git a/internal/server/instance/drivers/driver_qemu.go b/internal/server/instance/drivers/driver_qemu.go index 9b1a4c7f04d..7c05f8b9cb5 100644 --- a/internal/server/instance/drivers/driver_qemu.go +++ b/internal/server/instance/drivers/driver_qemu.go @@ -7759,6 +7759,11 @@ func (d *qemu) renderState(statusCode api.StatusCode) (*api.InstanceState, error d.logger.Warn("Error getting disk usage", logger.Ctx{"err": err}) } + status.StartedAt, err = d.StartedAt(d.InitPID()) + if err != nil { + return status, err + } + return status, nil }