2013-08-07 15 views
9

Git'de bir "işlem sarmalayıcısı" uygulamak istiyorum. Temelde ne yapacağını, bir işlem başlatır (bir düğüm sunucusunu söyler) ve onu izler (SIGKILL, SIGTERM ... gibi sinyalleri yakalar)Golang sinyallerini yakalama

Düğüm sunucusunu bir seferde başlatmak için yapmanız gereken bir şeydir. rutin syscall.Exec kullanarak:

func launchCmd(path string, args []string) { 
    err := syscall.Exec(path, args, os.Environ()) 
    if err != nil { 
    panic(err) 
    } 
} 

Sonra syscall tarafından yürütülen komutun ürettiği her olası sinyalleri yakalamak istiyorum. Gitmek için oldukça yeni oldum, herhangi bir yardım mutluluk duyacaktır.

+0

[Ayrıca bkz] (http://stackoverflow.com/q/11268943/720999). – kostix

cevap

30

git bir programın yürütüleceği üç yolu vardır:

  1. syscall paket syscall.Exec, syscall.ForkExec, syscall.StartProcess
  2. os paket ile birlikte os.StartProcess
  3. os/exec paket

iledüşük seviyededir. Bir tanıtıcı olarak uintptr döndürür.

os.StartProcess size Signal numaralı telefonu arayabileceğiniz güzel bir os.Process yapısını verir. os/exec, bir boruda kullanmanız için size io.ReaderWriter verir. Her ikisi de syscall'u dahili olarak kullanır.

Okuma sinyalleri, numaralı telefondan no'lu telefondan gönderilen mesajlar sizin için biraz zor gibi görünüyor. Mümkünse, syscall bunu yapabilirdi. Üst düzey paketlerde bariz bir şey görmüyorum. Sadece sizin dinlerken ilgilendiğiniz sinyalleri değiştirmeniz gerekir

sigc := make(chan os.Signal, 1) 
signal.Notify(sigc, 
    syscall.SIGHUP, 
    syscall.SIGINT, 
    syscall.SIGTERM, 
    syscall.SIGQUIT) 
go func() { 
    s := <-sigc 
    // ... do something ... 
}() 

:

böyle signal.Notify kullanabileceğiniz bir sinyal almak için. Bir sinyal belirtmezseniz, yakalanabilecek tüm sinyalleri yakalar.

Sinyali eşlemek için syscall.Kill veya Process.Signal kullanırsınız. Pid'i Process.Pid'dan veya syscall.StartProcess'dan alabilirsiniz.

+0

Thx Denerim. Fikir bu sarıcı tarafından izlemeye başlamak, sadece ne olduğunu izlemek için kullanılacaktır – rmonjo

+0

Tamam Programa girilen sinyalleri yakalayabilirim (örneğin^C yaparsam) ama sinyaller üretilemez Programım tarafından syscall tarafından çalıştırıldı. Herhangi bir düşünce ? – rmonjo

+0

@rmonjo * Programınızdan * veya * 'ya gönderilen bir sinyali mi yakalamaya çalışıyorsunuz? – Luke

16

Sen signal.Notify kullanabilirsiniz:

import (
"os" 
"os/signal" 
"syscall" 
) 

func main() { 
    signalChannel := make(chan os.Signal, 2) 
    signal.Notify(signalChannel, os.Interrupt, syscall.SIGTERM) 
    go func() { 
     sig := <-signalChannel 
     switch sig { 
     case os.Interrupt: 
      //handle SIGINT 
     case syscall.SIGTERM: 
      //handle SIGTERM 
     } 
    }() 
    // ... 
}