среда, 25 июля 2012 г.

Upstart hangs workaround

Иногда встречаю проблемы с Upstart скриптами на ubuntu 10.04, когда процесс аварийно завершился, а upstart это пропустил, и процесс висит stop/killed или start/killed с несуществующим pid.
В launcpad есть bug по этому поводу: https://bugs.launchpad.net/upstart/+bug/406397
Где то в середине проскакивает ссылка на скрипт, с решением проблемы. Скрипт весьма брутален- он создает процессы до тех пор, пока не будет создан процесс с зависшим pid. Мне, однако это помогло.
Ссылка на скрипт: http://heh.fi/tmp/workaround-upstart-snafu
На случай, если ссылку удалят...



#!/usr/bin/env ruby1.8

class Workaround
  def initialize target_pid
    @target_pid = target_pid

    first_child
  end

  def first_child
    pid = fork do
      Process.setsid

      rio, wio = IO.pipe

      # Keep rio open
      until second_child rio, wio
        print "\e[A"
      end
    end

    Process.wait pid
  end

  def second_child parent_rio, parent_wio
    rio, wio = IO.pipe

    pid = fork do
      rio.close
      parent_wio.close

      puts "%20.20s" % Process.pid

      if Process.pid == @target_pid
        wio << 'a'
        wio.close

        parent_rio.read
      end
    end
    wio.close

    begin
      if rio.read == 'a'
        true
      else
        Process.wait pid
        false
      end
    ensure
      rio.close
    end
  end
end

if $0 == __FILE__
  pid = ARGV.shift
  raise "USAGE: #{$0} pid" if pid.nil?
  Workaround.new Integer pid
end

Комментариев нет:

Отправить комментарий