On Tue, Dec 02, 2014 at 11:29:59PM +0530, Darshit Shah wrote:
On 12/02, Darshit Shah wrote:
[...]
>When I attempt to detach a running Screen session using `screen -Drr
>,session name` command, the original shell which contained the screen
>session does not return to a prompt. It instead remains hung and a while
>later I get the message:
>
>Warning: Program '/bin/bash' crashed
You're using screen's power detach (-D -r), from 'man screen':
| -D -r Reattach a session. If necessary detach and logout remotely
first.
Notice the *logout* part.
If you check screen.c (from GNU screen's source code), you will find:
| 1896 *D_POWER SIG_POWER_BYE power detach -- attacher kills his parent
| 1897 *D_REMOTE_POWER SIG_POWER_BYE remote power detach -- both
Then, in attacher.c, function Attach(how):
185 if (ret == SIG_POWER_BYE)
186 {
187 int ppid;
188 if (setgid(real_gid) || setuid(real_uid))
189 Panic(errno, "setuid/gid");
190 if ((ppid = getppid()) > 1)
191 Kill(ppid, SIGHUP); /* notice this part */
192 exit(0);
193 }
It sends a SIGHUP to the parent process, i.e. bash.
So, now that we know that, let's test it:
Shell 1:
dualbus@hp:~$ PS1='remote> '
remote> echo "$BASH_VERSION"
4.3.30(1)-maint
remote> screen -S bug -s ~/local/bin/bash
[... screen issues a clear screen... ]
dualbus@hp:~$
Shell 2:
dualbus@hp:~$ PS1='attacher> '
attacher> screen -Drr bug
[... gets the cleared screen from before ...]
dualbus@hp:~$
Shell 1:
[remote power detached from 3739.bug]
zsh: hangup ~/local/bin/bash
^ this tells us that bash was killed by a SIGHUP
Now, let's try again, ignoring SIGHUP:
Shell 1:
dualbus@hp:~$ PS1='$$ remote> '
3994 remote> trap '' HUP # ignore SIGHUP
3994 remote> screen -S bug -s ~/local/bin/bash
[.. again screen clears the terminal ..]
dualbus@hp:~$
Shell 2:
dualbus@hp:~$ PS1='$$ attacher> '
3954 attacher> screen -Drr bug
[.. we get the cleared screen ..]
dualbus@hp:~$
Shell 1:
[remote power detached from 4043.bug]
3994 remote> echo I am alive
I am alive
#1 shell survived the power detach, because we ignored the SIGHUP sent by
screen to its parent. Now... what does this mean?
I means that:
* It's not a bash bug. Bash is supposed to die from SIGHUP if you're not doing
anything to handle it. In fact, if you're using that screen's feature, it's
*supposed* to log out/kill its parent shell.
* It happens to other shells.
I just recompiled my Bash with debugging symbols and attempted to run Bash
under gdb. Here is the trace I received:
[remote power detached from 19442.pts-1.mordor]
Program received signal SIGHUP, Hangup.
Yep, dies from SIGHUP. Don't use screen's power detach (-D -r) if you don't
want this to happen. I normally use (-d -r), which doesn't have this effect.