nelhage / reptyr

Reparent a running program to a new terminal
MIT License
5.71k stars 216 forks source link

Detach child process to another virtual terminal #151

Open nataraj-hates-MS-for-stealing-github opened 4 months ago

nataraj-hates-MS-for-stealing-github commented 4 months ago

I do want to use reptyr, so I can fork current process and put it into separate window of tmux terminal. But I still did not find any way how I can do that. I wrote sample script:

#!/usr/bin/perl
use strict;
use POSIX;

my $pid = fork();

if ($pid)
{ 
  print "$pid\n";
  sleep 10;
  while (1) {print ".\n"; sleep 1};
} else
{
  my $i=0;
  (setsid() != -1)           || die "Can't start a new session: $!";
  sleep 10;
  while (1) {print "$i\n"; sleep 1; $i++};
}

I am trying to reptyr child to another terminal using pid it prints at the beginning, but I get

[-] Timed out waiting for child stop.

Adding -T does not help either.

Have you any idea how I can do that?

nataraj-hates-MS-for-stealing-github commented 3 months ago

I tried another approach, and it worked. Instead of putting child into new session, as I've done in the example above, I make it it's own group. And that worked for me:

#!/usr/bin/perl

use strict;
use POSIX;

my $pid = fork();
if ($pid)
{ 
  print "$pid\n";
  sleep 10;
  while (1) {print ".\n"; sleep 1};
} else
{
  my $i=0;
   (setpgid($$,$$) != -1)           || die "Can't create own group: $!";
  sleep 10;
  while (1) {print "$i\n"; sleep 1; $i++};
}

and then

reptyr [process id printed by the script above]

in another terminal

nataraj-hates-MS-for-stealing-github commented 3 months ago

But problems, I guess. still remains:

  1. It should be good to be able to detach child without doing any magic with group pid and session pid, just out of box
  2. Detaching process that is his own session is also valid case, I guess. It whould be better if it worked to.