func (pb *packetbeat) Run(b *beat.Beat) error { defer func() { if service.ProfileEnabled() { logp.Debug("main", "Waiting for streams and transactions to expire...") time.Sleep(time.Duration(float64(protos.DefaultTransactionExpiration) * 1.2)) logp.Debug("main", "Streams and transactions should all be expired now.") } // TODO: // pb.TransPub.Stop() }() pb.pub.Start() // This needs to be after the sniffer Init but before the sniffer Run. if err := droppriv.DropPrivileges(pb.config.RunOptions); err != nil { return err } // start services for _, service := range pb.services { service.Start() } var wg sync.WaitGroup errC := make(chan error, 1) // Run the sniffer in background wg.Add(1) go func() { defer wg.Done() err := pb.sniff.Run() if err != nil { errC <- fmt.Errorf("Sniffer main loop failed: %v", err) } }() logp.Debug("main", "Waiting for the sniffer to finish") wg.Wait() select { default: case err := <-errC: return err } // kill services for _, service := range pb.services { service.Stop() } waitShutdown := pb.cmdLineArgs.waitShutdown if waitShutdown != nil && *waitShutdown > 0 { time.Sleep(time.Duration(*waitShutdown) * time.Second) } return nil }
func (pb *Packetbeat) Run(b *beat.Beat) error { // start services for _, service := range pb.services { service.Start() } // run the sniffer in background go func() { err := pb.Sniff.Run() if err != nil { logp.Critical("Sniffer main loop failed: %v", err) os.Exit(1) } pb.over <- true }() // Startup successful, disable stderr logging if requested by // cmdline flag logp.SetStderr() logp.Debug("main", "Waiting for the sniffer to finish") // Wait for the goroutines to finish for range pb.over { if !pb.Sniff.IsAlive() { break } } // kill services for _, service := range pb.services { service.Stop() } waitShutdown := pb.CmdLineArgs.WaitShutdown if waitShutdown != nil && *waitShutdown > 0 { time.Sleep(time.Duration(*waitShutdown) * time.Second) } return nil }
func (pb *Packetbeat) Run(b *beat.Beat) error { // start services for _, service := range pb.services { service.Start() } var wg sync.WaitGroup errC := make(chan error, 1) // Run the sniffer in background wg.Add(1) go func() { defer wg.Done() err := pb.Sniff.Run() if err != nil { errC <- fmt.Errorf("Sniffer main loop failed: %v", err) } }() logp.Debug("main", "Waiting for the sniffer to finish") wg.Wait() select { default: case err := <-errC: return err } // kill services for _, service := range pb.services { service.Stop() } waitShutdown := pb.CmdLineArgs.WaitShutdown if waitShutdown != nil && *waitShutdown > 0 { time.Sleep(time.Duration(*waitShutdown) * time.Second) } return nil }