crigler/dtach

Using -N argument with a terminal multiplexer in a TTY-less environment

Opened this issue · 6 comments

While playing with dtach in a Docker container, I found that dtach -N <some socket> <some command> seems to exit silently when it's invoked in an environment which has no terminal (which is Docker's default) but works fine if I make Docker allocate a terminal. That would make sense for the -c mode, but I'd imagine that -N could theoretically work just fine when dtach is started in a "terminal-less" environment since it creates its own PTY for the command and never attaches to it. Is this just a side effect of how dtach currently handles terminals, or is there a fundamental limitation in the Linux APIs that would prevent dtach from functioning correctly in a terminal-less environment without daemonizing?

It's an easy enough fix in my own project to just allocate a terminal, but I figured I'd mention it in case you thought it was worth looking at eventually.

I just tried this:

$ setsid -w nohup env -i dtach -N /home/robert/tmp/.dt16 -Ez bash >/dev/null </dev/null 2>&1

It creates a shell and waits. The dtach process is not associated with any terminal, has it's stdio pointing at /dev/null and has a completely empty environment. I also tried running it from init:

P2:23:respawn:/bin/su robert -c 'dtach -N /home/robert/tmp/.dt16 -Ez bash'

So ... works for me.

Any more details? Traces, errors?

Huh. I thought I'd managed to rule out the issue being in the script I was running, but apparently not. I can reproduce it if I have dtach try to start either dvtm or tmux, though, so the real issue seems to be that a terminal multiplexer won't run inside a dtach -N session when dtach has no parent terminal. setsid -w nohup env -i dtach -N /tmp/dtsession -Ez dvtm >/dev/null </dev/null 2>&1 is exiting with code 1 on my machine.

Humm, tmux seems to work fine, as long as I add TERM=$TERM to the environment list.
OTOH: dvtm appears to be a bit crash happy, maybe it needs something else too.

Right; I forgot about $TERM. That makes sense. In that case, I guess there's really no issue with dtach then, unless you think it should be setting $TERM for some reason. But since it's designed to be terminal-agnostic anyway, I guess that wouldn't make much sense.

this is also a problem when running dtach under a systemd session and drove me up the walll... I found this discussion:

https://stackoverflow.com/questions/34808956/dtach-in-systemd-service-file

... which seem to say that chvt is required before this works, and a tty needs to be allocated.

... which makes no sense to me: the whole point of this thing is to have no terminal available in the first place.

it would be great if this could be started without any TTY.

actually, nevermind - i was able to run this simply by adding TERM:

[Unit]
Description=IRC screen session
After=network.target

[Service]
Type=simple
Environment="TERM=xterm"
User=%i
ExecStart=/bin/sh -c 'exec /usr/bin/dtach -N %t/user/$(id -u)/dtach-irssi.socket irssi -c /dev/null'
ExecStop=/bin/sh -c 'echo /quit | exec /usr/bin/dtach -a %t/user/$(id -u)/dtach-irssi.socket'

[Install]
WantedBy=multi-user.target