如何通过STDIN找出远程打印机正在打印页面的进程是什么?

如何通过STDIN找出远程打印机正在打印页面的进程是什么?

某些进程将控制台的输出发送stdin到远程打印服务器。如果配置了cups打印机,则会打印它。所以我需要禁用杯子。我怀疑有什么东西正在运行lp或者lpr。它通常在我编译大项目后一段时间开始。

有没有办法在哪个进程运行后找到它?

我唯一知道的就是在杯赛网页历史记录中查看这份工作http://remote-print-server.example.com:631/:

ID        Name       User Size  Pages   State
foo-11612 (stdin)    user 1634k Unknown completed at Tue 06 Feb 2018 12:49:30 UTC

更新:这是关于通过stdin.除了 之外,我没有任何本地日志journalctl,因为打印机未在本地连接:-(。上面的文本是从 cups 网络日志复制的。

答案1

假设您的控制台是/dev/ttyS0,您可以/proc/<pid>/fd使用该设备搜索文件描述符:

$ sudo ls -l /proc/[0-9]*/fd

然后在该输出中搜索1 -> /dev/ttyS0(标准输出)或2 -> /dev/ttyS0(标准错误),您将能够找到使用控制台进行 stdout 或 stderr 的任何进程的 ID。

或者,如果你有lsof,你可以使用它:

$ sudo lsof /dev/ttyS0
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
agetty  3955 root    0u   CHR   4,64      0t0 4046 /dev/ttyS0
agetty  3955 root    1u   CHR   4,64      0t0 4046 /dev/ttyS0
agetty  3955 root    2u   CHR   4,64      0t0 4046 /dev/ttyS0

答案2

在 Linux 上,假设这是写入 shell 的标准输出,您应该能够找到潜在的进程来lsof检查谁已连接:

% lsof -t "/proc/$$/fd/1"
23717
26269

strace然后,您可以使用、perf trace、 等跟踪程序或使用 eBPF找出谁在执行写入操作:

% strace -s 1000 -ewrite -p "$(lsof -t "/proc/$$/fd/1" | paste -sd,)"
[pid 26680] write(1, "foo\n", 4)        = 4
[pid 26680] write(1, "bar\n", 4)        = 4
[pid 26680] write(1, "baz\n", 4)        = 4

相关内容