// followFile outputs the contents of the file to stdout relative to the end of // the file. func (l *LogsCommand) followFile(client *api.Client, alloc *api.Allocation, follow bool, task, logType, origin string, offset int64) (io.ReadCloser, error) { cancel := make(chan struct{}) frames, err := client.AllocFS().Logs(alloc, follow, task, logType, origin, offset, cancel, nil) if err != nil { return nil, err } signalCh := make(chan os.Signal, 1) signal.Notify(signalCh, os.Interrupt, syscall.SIGTERM) // Create a reader var r io.ReadCloser frameReader := api.NewFrameReader(frames, cancel) frameReader.SetUnblockTime(500 * time.Millisecond) r = frameReader go func() { <-signalCh // End the streaming r.Close() }() return r, nil }
// followFile outputs the contents of the file to stdout relative to the end of // the file. If numLines does not equal -1, then tail -n behavior is used. func (f *FSCommand) followFile(client *api.Client, alloc *api.Allocation, path, origin string, offset, numLines int64) (io.ReadCloser, error) { cancel := make(chan struct{}) frames, err := client.AllocFS().Stream(alloc, path, origin, offset, cancel, nil) if err != nil { return nil, err } signalCh := make(chan os.Signal, 1) signal.Notify(signalCh, os.Interrupt, syscall.SIGTERM) // Create a reader var r io.ReadCloser frameReader := api.NewFrameReader(frames, cancel) frameReader.SetUnblockTime(500 * time.Millisecond) r = frameReader // If numLines is set, wrap the reader if numLines != -1 { r = NewLineLimitReader(r, int(numLines), int(numLines*bytesToLines), 1*time.Second) } go func() { <-signalCh // End the streaming r.Close() }() return r, nil }