Code Con Carne via GNU coreutils Bug Reports <[email protected]>
writes:

> $ timeout 1s echo foo > pipe
>
> expected: times out after 1s
> actual: never times out; ctrl-c to exit
>
> coreutils 9.4-3ubuntu6.1 amd64

In this example, your shell opens "pipe" for writing. There are no
readers, so the shell is blocked. The 'timeout' command is not supposed
to kill the shell, it's parent, so it doesn't.

You can verify this yourself like so:

    $ mkfifo pipe
    $ timeout 1 echo foo > pipe &
    [1] 1483195

In another terminal window, we can see the process is 'bash' and check
what it is doing:

    $ ps -p 1483195
        PID TTY          TIME CMD
    1483195 pts/5    00:00:00 bash
    $ strace -p 1483195
    strace: Process 1483195 attached
    openat(AT_FDCWD, "pipe", O_WRONLY|O_CREAT|O_TRUNC, 0666

So it is blocked opening "pipe".

Returning to the original terminal window, we can read from "pipe":

    $ cat pipe
    foo
    [1]+  Done                       timeout 1 echo foo > pipe

So the shell is unblocked and finishes executing the command.

In the terminal window with 'strace' running, we can see that 'timeout'
isn't invoked until after "pipe" is opened after being unblocked:

    $ strace -p 1483195
    strace: Process 1483195 attached
    openat(AT_FDCWD, "pipe", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
    dup2(3, 1)                              = 1
    close(3)                                = 0
    execve("/home/collin/.local/bin/timeout", ["timeout", "1", "echo", "foo"], 
0x561e21977ae0 /* 86 vars */) = 0

I agree that this behavior isn't obvious. :)

Collin



Reply via email to