aboutsummaryrefslogtreecommitdiff
path: root/ReapperRun/README.md
diff options
context:
space:
mode:
Diffstat (limited to 'ReapperRun/README.md')
-rw-r--r--ReapperRun/README.md56
1 files changed, 56 insertions, 0 deletions
diff --git a/ReapperRun/README.md b/ReapperRun/README.md
new file mode 100644
index 0000000..59b602b
--- /dev/null
+++ b/ReapperRun/README.md
@@ -0,0 +1,56 @@
+# ReaperRun
+
+A simple wrapper that adds `PR_SET_CHILD_SUBREAPER` flag to a program.
+
+## Background
+
+i3wm can start daemons and programs (e.g. `nm-applet` and `xterm`), but it doesn't set the subreapper flag. Since Linux 3.14, service managers can use this flag to act as "init", reaping orphan children. i3wm starts processes (the `exec` command in configuration file) by double-forking, and the intermediate fork immediately exits after forking the child, making the children orphan. systemd-user uses this flag to reap orphan children, but i3wm is not started using systemd-user but a display manager (e.g. SDDM in my case). SDDM does not set this flag as well, making all processes under i3 reaped by init (1). This messes up the process tree.
+
+Read more:
+
+* [https://github.com/i3/i3/issues/4274](https://github.com/i3/i3/issues/4274)
+
+* [https://blog.lilydjwg.me/2014/2/23/let-s-adopt-orphaned-processes.43035.html](https://blog.lilydjwg.me/2014/2/23/let-s-adopt-orphaned-processes.43035.html)
+
+The trick is simple: Just add the subreaper flag to i3 or any of its parents. According to prctl(2), this flag will be preserved across execve(2), so it is best to make a wrapper to set the flag and exec i3 rather than patching i3.
+
+## Usage
+
+1. Run `make release`. The output is `main`.
+
+2. Ask your display manager to run `/path/to/reapperrun /path/to/i3` instead of running i3 directly. That's it.
+
+## Effect
+
+Tree of init before:
+
+```
+at-spi-bus-laun,768 --launch-immediately
+ |-dbus-daemon,781 --config-file=/usr/share/defaults/at-spi2/accessibility.conf --nofork --print-address 3
+at-spi2-registr,8096 --use-gnome-session
+blueman-applet,8059 /usr/bin/blueman-applet
+blueman-tray,8110 /usr/bin/blueman-tray
+chromium,8485
+fcitx5,8064
+i3bar,8048 --bar_id=bar-0 --socket=/run/user/10001/i3/ipc-socket.8025
+keepassxc,8073
+fish,6582
+nm-applet,8061
+i3,8025
+telegram-deskto,8248
+xterm,8119
+```
+
+Tree of init after:
+```
+i3,9348
+ |-blueman-applet,9381 /usr/bin/blueman-applet
+ |-blueman-tray,9433 /usr/bin/blueman-tray
+ |-fcitx5,9391
+ |-i3bar,9371 --bar_id=bar-0 --socket=/run/user/10001/i3/ipc-socket.9348
+ |-keepassxc,9395
+ |-nm-applet,9383
+ `-xterm,9436
+```
+
+You can see that all processes are under i3 now.