diff --git a/internal/journal/journal.go b/internal/journal/journal.go index b9b9f917..7a622d3f 100644 --- a/internal/journal/journal.go +++ b/internal/journal/journal.go @@ -31,9 +31,9 @@ const journalctl = "journalctl" var commandContext = exec.CommandContext // allow override for test -func logs(ctx context.Context, unit string, opts api.ServiceLogsOptions) (io.ReadCloser, error) { +func logs(ctx context.Context, unit string, opts api.ServiceLogsOptions) (io.ReadCloser, func() error, error) { if !ValidUnit(unit) { - return nil, fmt.Errorf("journal logs: invalid unit: %s", unit) + return nil, nil, fmt.Errorf("journal logs: invalid unit: %s", unit) } args := []string{"-u", unit, "--no-hostname"} args = append(args, "-n") @@ -61,14 +61,14 @@ func logs(ctx context.Context, unit string, opts api.ServiceLogsOptions) (io.Rea cmd := commandContext(ctx, journalctl, args...) p, err := cmd.StdoutPipe() if err != nil { - return nil, err + return nil, nil, err } if err := cmd.Start(); err != nil { - return nil, err + return nil, nil, err } - return p, nil + return p, cmd.Wait, nil } // follow synchronously follows the io.Reader, writing each new journal entry to channel. diff --git a/internal/journal/logs.go b/internal/journal/logs.go index dfdf8618..2977eff0 100644 --- a/internal/journal/logs.go +++ b/internal/journal/logs.go @@ -16,7 +16,7 @@ func Logs(ctx context.Context, unit string, opts api.ServiceLogsOptions) (<-chan return nil, fmt.Errorf("journal logs: invalid unit: %s", unit) } - reader, err := logs(ctx, unit, opts) + reader, wait, err := logs(ctx, unit, opts) if err != nil { return nil, err } @@ -26,6 +26,7 @@ func Logs(ctx context.Context, unit string, opts api.ServiceLogsOptions) (<-chan go func() { defer close(outCh) follow(ctx, reader, outCh) + wait() }() return outCh, nil