Beefy Boxes and Bandwidth Generously Provided by pair Networks
Clear questions and runnable code
get the best and fastest answer

Re: Forking an operative terminal

by Anonymous Monk
on Dec 31, 2012 at 15:42 UTC ( #1011067=note: print w/replies, xml ) Need Help??

in reply to Forking an operative terminal

Maybe the -i switch (force interactive) to the shell helps (xterm -e "sh -i -c yourcommand"). If not, I'd put your command into a (temporary) .bashrc or similar. The third option might be starting a new shell after the command: fork() or exec("xterm", "-e", "sh -c 'somecommand; sh'");

(Of course, you should find out the user's preferred shell instead of just using /bin/sh or similar)

Replies are listed 'Best First'.
Re^2: Forking an operative terminal
by perlgrim (Initiate) on Dec 31, 2012 at 17:09 UTC

    Hey! it works!

    The third option you suggested does the job, using as well sh or bash as xterm or gnome-terminal. I include the code:

    ... $tks->signal_connect( 'clicked' => sub { my $command = "tw pro:$currproj"; my $ret = fork(); if($ret == 0) { # this is the fork: become $command and go away. exec("gnome-terminal", "-e", "bash -c '$command; bash'"); } else { # this is the parent: do nothing and go ahead. } return FALSE; } );

    I detect zombie processes remaining in my ps -e:

    2504 ? 00:00:01 perl 2509 ? 00:00:01 gnome-terminal <defunct> 2573 ? 00:00:01 gnome-terminal <defunct> 2638 ? 00:00:01 gnome-terminal <defunct> 2702 ? 00:00:01 gnome-terminal <defunct> 2767 ? 00:00:00 gnome-terminal 2773 ? 00:00:00 gnome-pty-helpe
    that dissapear when the perl script comes to en end. Thank you very much, Anonymous Wisdom.

      You can get rid of the defunct processes by setting $SIG{CHLD} = 'IGNORE' in the parent. Also, you should use sh -c instead of bash -c in "bash -c '$command; bash'", since only sh is guaranteed to exist.

      And the user's shell can be found with this piece of code:

      my ($shell, $uid); while (($uid, $shell) = (getpwent)[2,8]) { last if $uid == $<; } say $shell;

        Fine, I was trying to place an 'exit' into the exec to solve the problem, but the signal handler worked perfectly and sent the zombies back to their niches. As well as the code for user shell determination. Thanks again, your Wisdom.

        I also want to apologize because now I realize that my question concerned the shell and OS, not perl. Happy New Year to all the Monastery.

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1011067]
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others scrutinizing the Monastery: (6)
As of 2018-11-14 08:35 GMT
Find Nodes?
    Voting Booth?
    My code is most likely broken because:

    Results (165 votes). Check out past polls.