Advertisement
Guest User

Untitled

a guest
Nov 9th, 2011
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 1.54 KB | None | 0 0
  1. #!/usr/bin/ruby
  2. #coding: utf-8
  3.  
  4. out_rd, out_wr = IO.pipe
  5. err_rd, err_wr = IO.pipe
  6.  
  7. pid = fork
  8.  
  9. if pid
  10.     out_wr.close
  11.     err_wr.close
  12.  
  13.     out_eof = false
  14.     err_eof = false
  15.  
  16.     out_log = ''
  17.     err_log = ''
  18.  
  19.     loop {
  20.         fds = []
  21.         fds << out_rd unless out_eof
  22.         fds << err_rd unless err_eof
  23.  
  24.         break if fds.size < 1
  25.  
  26.         IO.select(fds)
  27.  
  28.         out = ''
  29.         begin
  30.             out = out_rd.read_nonblock(200)
  31.         rescue Errno::EAGAIN
  32.             ;
  33.         rescue EOFError
  34.             out_eof = true
  35.         end
  36.  
  37.         err = ''
  38.         begin
  39.             err = err_rd.read_nonblock(200)
  40.         rescue Errno::EAGAIN
  41.             ;
  42.         rescue EOFError
  43.             err_eof = true
  44.         end
  45.  
  46.         out_log << out
  47.         err_log << err
  48.  
  49.         out_log = out_log[(out_log.size / 2) .. -1] if out_log.size > 5000
  50.         err_log = err_log[(out_log.size / 2) .. -1] if err_log.size > 5000
  51.  
  52.         $stdout.write(out)
  53.         $stderr.write(err)
  54.     }
  55.  
  56.     pid, status = Process.wait2(pid)
  57.     exitcode = status.exited? ? status.exitstatus : 128 + status.termsig
  58.  
  59.     if exitcode != 0 && ![9, 15].include?(status.termsig)
  60.         unless fork
  61.             text =
  62.                 "Команда: #{ARGV.join(' ')}\n" +
  63.                 "#{status.inspect}\n"
  64.             text << "\nСообщения об ошибках:\n" + err_log if err_log.size > 0
  65.             text << "\nВывод программы:\n" + out_log if out_log.size > 0
  66.             exec "zenity", "--no-markup", "--error", "--title=Работа программы #{ARGV[0]} была завершена некорректно", "--text=" + text
  67.         end
  68.     end
  69.  
  70.     exit exitcode
  71.  
  72. else
  73.     out_rd.close
  74.     err_rd.close
  75.     $stdout.reopen out_wr
  76.     $stderr.reopen err_wr
  77.     exec *ARGV
  78. end
  79.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement