识别向 shell 脚本发送信号的进程

识别向 shell 脚本发送信号的进程

我编写了一个 shell 脚本,该脚本使用该trap功能在收到 SIGUSR1 信号时输出其进度,但我不知道如何让该脚本能够将进度输出到发送信号的进程的 STDOUT。因此,如果脚本在终端模拟器中运行/dev/pts/10,并且我从 上的终端模拟器向进程发送信号/dev/pts/11,则输出将发送到/dev/pts/10,但我想发送到/dev/pts/11。我不想通过wall硬编码 shell 重定向发送进度消息到特定的 STDOUT。

答案1

你想要的东西是不可能的。进程无法确定是哪个进程向它发送了信号:如果多个进程在足够短的时间窗口内向同一进程发送相同的信号,则接收者只会看到一个信号。

即使您知道哪个进程发送了信号,您也可能无权写入发送者的标准输出。

执行您想要的操作的合理方法是让进程侦听 Unix 套接字。当该套接字上有连接时,将进度信息写入该套接字上。让另一端负责将其打印到想要的位置。

要查询状态,您可以使用socket某些发行版中的实用程序,或者更强大但更复杂的实用程序socat

socket -r ./my-program-status              # If the socket is a filesystem domain socket in the current directory
socat UNIX-CLIENT:my-program-status -      # If the socket is a filesystem domain socket in the current directory
socat ABSTRACT-CLIENT:my-program-status -  # If the socket is an abstract domain socket in the current directory

服务器端概念验证:

while date | socket -q -s ./status; do echo .; done

另一种方法是让程序定期将其状态写入文件。

相关内容