You are not logged in. Login Now
 0-10          
 
Author Message
trancequility
Funky unixisms going on. Mark Unseen   Sep 9 14:08 UTC 2007

There is something funky going on with party that I really don't quite
understand yet.

djdoboy  25600  0.0  0.3   984  1552 px  Is+    8:51AM    0:00.04 -bash (bash)
djdoboy  14220  0.0  0.4  1168  1904 px  T      8:59AM    0:00.02
/usr/local/bin/ruby ./whore.rb


Welcome to PARTY!  Type '?' for help:
---- djdoboy joining (Sep  9 08:59)

User                             Started          Channel
djdoboy                          Sep  9 08:59:22  party
trancequility                    Sep  9 10:01:25  party

djdoboy  px 67-150-245-84.oa  8:52AM  1:02 -bash 

As you can see, djdoboy has been idle in party for over an hour. Ie, there
has been no login/logout from party. The only thing party logs show is me
logging in and out of party.

I tried to duplicate this by doing

party &

but it doesn't work.
10 responses total.
trancequility
response 1 of 10: Mark Unseen   Sep 9 18:26 UTC 2007

part of the ruby code that is used to execute this engineering wonder is

2.times do |i|
        threads[i]=Thread.new do
        %x{/usr/local/bin/party}
        end
end

I'm assuming that since djdoboy never logs out of party, that this line of
code created some kind of deadlock.
nharmon
response 2 of 10: Mark Unseen   Sep 9 21:13 UTC 2007

It's strange that you don't understand that > party & < is creating a
child process of whatever shell you're using. A child process that is
going to receive sighup when you exit. But when you create a new thread
in a ruby script, that process is not a child of the shell so it isn't
going to receive the hangup signal. That's why it stays running, not
because it's in "deadlock"...whatever that means. 

nharmon@grex ~ > pico &
[1] 7375
[1]  + suspended (tty output)  pico
nharmon@grex ~ > ps -j
USER       PID  PPID  PGID     SESS JOBC STAT  TT       TIME COMMAND
nharmon   9240 22519  9240 d6bd1540    0 Is    pi    0:00.07 -zsh (zsh)
nharmon   7375  9240  7375 d6bd1540    1 TN    pi    0:00.00 pico
nharmon   2071  9240  2071 d6bd1540    1 R+    pi    0:00.00 ps -j

See how pico's PPID is the PID of zsh? When zsh exits its going to send
a SIGHUP to every process whose PPID is the same is zsh's PID. Now let's
start pico using an adaptation of your script:

nharmon@grex ~ > ruby ./test.rb
nharmon@grex ~ > ps -j
USER       PID  PPID  PGID     SESS JOBC STAT  TT       TIME COMMAND
nharmon   9240 22519  9240 d6bd1540    0 Is    pi    0:00.15 -zsh (zsh)
nharmon  16735     1 21302 d6bd1540    0 I     pi    0:00.00
/usr/local/bin/pic
nharmon  27759  9240 27759 d6bd1540    1 R+    pi    0:00.00 ps -j

Woah!, pico's PPID is now 1, not 9240.

I don't feel like going any further seeing as there is a script in your
homedir to execute getty 100 times, in a desperate attempt to DoS grex.
trancequility
response 3 of 10: Mark Unseen   Sep 9 22:38 UTC 2007

"A child process that is
 going to receive sighup when you exit. But when you create a new thread
 in a ruby script, that process is not a child of the shell so it isn't
 going to receive the hangup signal."

I don't think so nate. 

-bash-3.2$ shopt huponexit
huponexit       off

and now from bash(1)

"If the huponexit shell option has  been  set  with  shopt,
       bash  sends a SIGHUP to all jobs when an interactive login
       shell exits."

In other words, sighup isn't set because the option isn't enabled on my shell
(by default). Nice try rookie. Now please shut the fuck up on this forum. You
once again don't know what you are talking about.
nharmon
response 4 of 10: Mark Unseen   Sep 9 22:45 UTC 2007

This response has been erased.

nharmon
response 5 of 10: Mark Unseen   Sep 9 22:47 UTC 2007

Woah, you totally ripped that off from the guy responding your exact
question in comp.lang.ruby:   http://tinyurl.com/3x72u4

Setting huponexit causes the shell to send a sighup to all processes
under your uid when you exit the shell.
trancequility
response 6 of 10: Mark Unseen   Sep 9 22:52 UTC 2007

"But when you create a new thread
  in a ruby script, that process is not a child of the shell so it isn't
  going to receive the hangup signal.'

You are once again wrong nate. 

huponexit       on
-bash-3.2$ ./whore.rb &
[1] 28137
-bash-3.2$ ps waux | grep djdoboy
djdoboy    554  0.0  0.3   836  1612 pc  Ss     6:28PM    0:00.06 -bash (bash)
djdoboy  28137  0.0  0.4  1368  1992 pc  S      6:48PM    0:00.02
/usr/local/bin/ruby ./whore.rb
djdoboy  27744  0.0  0.1   404   560 pc  S      6:48PM    0:00.01
/usr/libexec/getty std.19200 tty00
djdoboy   3610  0.0  0.1   368   544 pc  S      6:48PM    0:00.01
/usr/libexec/getty std.19200 tty00
djdoboy  32117  0.0  0.1   348   556 pc  S      6:48PM    0:00.00
/usr/libexec/getty std.19200 tty00
djdoboy  24581  0.0  0.1   328   548 pc  S      6:48PM    0:00.01
/usr/libexec/getty std.19200 tty00
djdoboy  23267  0.0  0.1   448   556 pc  S      6:48PM    0:00.00
/usr/libexec/getty std.19200 tty00
djdoboy   1943  0.0  0.1   328   552 pc  S      6:48PM    0:00.01
/usr/libexec/getty std.19200 tty00
djdoboy  22936  0.0  0.1   320   580 pc  S      6:48PM    0:00.00
/usr/libexec/getty std.19200 tty00
djdoboy  28695  0.0  0.1   380   556 pc  S      6:48PM    0:00.00
/usr/libexec/getty std.19200 tty00
djdoboy  25585  0.0  0.1   288   536 pc  S      6:48PM    0:00.00
/usr/libexec/getty std.19200 tty00
djdoboy  22280  0.0  0.1   368   560 pc  S      6:48PM    0:00.00
/usr/libexec/getty std.19200 tty00
djdoboy  26495  0.0  0.1   328   536 pc  S+     6:48PM    0:00.00 grep djdoboy
djdoboy   3258  0.0  0.1   664   412 pc  R+     6:48PM    0:00.00 ps -waux
-bash-3.2$ exit

now I log back in
-bash-3.2$ ps -p 81327
  PID TT  STAT       TIME COMMAND
-bash-3.2$ ps -p 28137
  PID TT  STAT       TIME COMMAND
-bash-3.2$ ps waux | grep djdoboy
djdoboy  32047  0.0  0.3  1008  1544 pc  Ss     6:49PM    0:00.02 -bash (bash)
djdoboy  13764  0.0  0.0  1008     4 pc  R+     6:50PM    0:00.00 grep djdoboy
(bash)
djdoboy  19327  0.0  0.1   444   408 pc  R+     6:50PM    0:00.00 ps -waux
-bash-3.2$ 

OMFG, MY RUBY THREADS ARE GONE!
nharmon
response 7 of 10: Mark Unseen   Sep 9 23:09 UTC 2007

Instead of setting huponexit I would recommend adding lines to your ruby
script to wait and then do a Process.kill on everything with the same
process group id when the script exits. Even better would be to do a
trap("HUP") in ruby to trap sighup and then do the Process.kill.

Now that you understand how huponexit works, maybe you can think of why
it would be a bad idea to enable huponexit on accounts you log in
multiple sessions, or on accounts that need to have processes running
under them (like say, root).
nharmon
response 8 of 10: Mark Unseen   Sep 9 23:27 UTC 2007

Maybe this will demonstrate my point better:

   #!/usr/bin/ruby
   pid = fork do
     Signal.trap('HUP') do
        Process.kill(-1, Process.getpgrp())
     end
     threads=[]
     threads[0]=Thread.new %x{/usr/local/bin/pico}
     loop do
       sleep 20
     end
   end
   Process.detach(pid)

Without setting huponexit, this will cause the ruby script's child
processes to exit shortly after logoff. I think the 'sleep 20' causes
the delay, maybe cross can elaborate.
trancequility
response 9 of 10: Mark Unseen   Sep 9 23:43 UTC 2007

Chirst, nate. First off, you don't need to create a single thread in this
case. Second, even if I did need to create a single thread in this case, it
really wouldn't work because you don't fucking let the thread exit properly.
Third, using sleep to synchronize a process is vivek move. Just stick to what
you know best. Butt fucking mcnally.
trancequility
response 10 of 10: Mark Unseen   Sep 10 00:08 UTC 2007

I think the reason nate is seeing 1 is because this dumbass did a fork in his
code.
 0-10          
Response Not Possible: You are Not Logged In
 

- Backtalk version 1.3.30 - Copyright 1996-2006, Jan Wolter and Steve Weiss