Hey! Danny Milosavljevic <dan...@scratchpost.org> skribis:
> On Mon, 05 Feb 2018 21:49:08 +1100 > Carlo Zancanaro <ca...@zancanaro.id.au> wrote: > >> User services - Alex has already sent a patch to the list to allow >> generating user services from the Guix side. The idea is to >> generate a Shepherd config file, allowing a user to invoke >> shepherd manually to start their services. > >>A further extension to >> this would be to have something like systemd's "user sessions", >> where the pid 1 Shepherd automatically starts a user's services >> when they log in. > > I assume that means "starts a user's shepherd when they log in". > > elogind already emits a signal on dbus which tells you when a user logged in > > return sd_bus_emit_signal( > u->manager->bus, > "/org/freedesktop/login1", > "org.freedesktop.login1.Manager", > new_user ? "UserNew" : "UserRemoved", > "uo", (uint32_t) u->uid, p); I think there’s Guile D-Bus client though. Another yak to shave… > Also, a directory /run/user/<id> appears - which alternatively can be > monitored by inotify or something. > > So the system shepherd could have a shepherd service which does > > while (1) { > wait until /run/user/<id> appears > vfork > if child: setuid, exec user shepherd, _exit > if parent: wait until child dies > } > > We better be sure that no one else can create directories in /run/user . > > In non-pseudocode, both "wait until /run/user/<id> appears" and > "wait until child dies" would have to be in the same call, > maybe epoll or something. Yes, inotify (ISTR there *are* inotify bindings for Guile somewhere.) > Maybe call the service shepherd-nursery-service or something, like a star > nursery :) :-) Ludo’.