Sending SIGINT from keyboard to piped commands in bash

后端 未结 2 1002
孤街浪徒
孤街浪徒 2021-01-04 08:31

If in bash I run a | b | c | d on the command line and then press ^C, which process gets the signal?

相关标签:
2条回答
  • I like experimentation better:

    #!/bin/bash
    # FILE /tmp/bla.sh
    # trap ctrl-c and call ctrl_c()
    trap ctrl_c INT
    
    MY_ID=$1 # Identifier for messages
    
    function ctrl_c() {
        echo >&2 "GOODBYE $MY_ID"
        exit
    }
    
    # This will continue until interrupted, e.g. if the input/output get closed
    cat
    # If we somehow got to the end
    echo >&2 "grace $MY_ID"
    

    Chaining them, running and breaking them

    nitz@mars:~$ /tmp/bla.sh 1 | /tmp/bla.sh 2
    ^CGOODBYE 2
    GOODBYE 1
    0
    

    As you can see, both executions got the interrupt signal, meaning they all get killed. Furthermore, the order in which they output that they were killed is random, e.g.:

    nitz@mars:~$ /tmp/bla.sh 1 | /tmp/bla.sh 2 | /tmp/bla.sh 3 | /tmp/bla.sh 4
    ^CGOODBYE 2
    GOODBYE 4
    GOODBYE 1
    GOODBYE 3
    
    0 讨论(0)
  • 2021-01-04 09:21

    In short, they all do.

    When setting up a pipeline, the shell creates a process group. ^C is interpreted by the kernel's line discipline as the user's request to interrupt the process group currently running in the foreground. Sending a signal such as SIGINT to a process group automatically delivers the signal to all processes in the group.

    0 讨论(0)
提交回复
热议问题