![识别向 shell 脚本发送信号的进程](https://linux22.com/image/175804/%E8%AF%86%E5%88%AB%E5%90%91%20shell%20%E8%84%9A%E6%9C%AC%E5%8F%91%E9%80%81%E4%BF%A1%E5%8F%B7%E7%9A%84%E8%BF%9B%E7%A8%8B.png)
我编写了一个 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
另一种方法是让程序定期将其状态写入文件。