某些进程将控制台的输出发送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