我的桌面文件: /usr/share/applications/write-to-stdout-sterr.desktop
[Desktop Entry]
# created by autocreate-desktop-files-for-pycharm.py
Name=write-to-stdout-sterr
Icon=/usr/share/pixmaps/python2.7.xpm
Exec=/var/tmp/write-to-stdout-sterr.py
Terminal=false
Type=Application
Categories=Application
Run Code Online (Sandbox Code Playgroud)
我运行这个脚本:
#!/usr/bin/python
import sys
import time
import datetime
sys.stdout.write('########### stdout %s\n' % datetime.datetime.now())
sys.stderr.write('+++++++++++ sdterr %s\n' % datetime.datetime.now())
time.sleep(120)
Run Code Online (Sandbox Code Playgroud)
和 chmod a+rx /var/tmp/write-to-stdout-sterr.py
如果我通过 windows-key (launcher) 调用它
我想看看 stdout/stderr 去哪里。
root@aptguettler:~# ls -l /proc/$(pgrep -f write-to)/fd
Run Code Online (Sandbox Code Playgroud)
输出:
insgesamt 0
lr-x------ 1 tguettler tguettler 64 Dez 16 12:42 0 -> /dev/null
lrwx------ 1 tguettler tguettler 64 Dez 16 12:42 1 -> 'socket:[346100]'
lrwx------ 1 tguettler tguettler 64 Dez 16 12:42 2 -> 'socket:[346100]'
Run Code Online (Sandbox Code Playgroud)
socket:[346100]去哪里?我怎样才能看到插座的另一端?
上面的问题是这个问题的更精确版本:失败的应用程序启动的错误消息在哪里?
小智 2
套接字是双向通信链路的一个端点。在您的情况下,两个输出流都写入一个套接字。您需要两个套接字才能有“另一端”。
去哪里
socket:[346100]?
socket:[346100]是套接字本身。这是进入套接字的进程流。
我怎样才能看到插座的另一端?
要查看另一个端点(如果存在),请查看havingrem_address列。/proc/net/tcpinode 346100
OP 的主要目标是找出应用程序如何通过桌面条目(又名.desktop文件)启动。这个问题没有答案,因为它依赖于实现,并且我上面链接的规范没有提供关于如何重定向标准流的标准(如果有的话)。
对于最新的 Ubuntu 版本,可以找到这些套接字的连接位置。您在括号中看到的数字是内核sockfs 虚拟文件系统中的 inode 。每个proc(5)手册:
For file descriptors for pipes and sockets, the entries will
be symbolic links whose content is the file type with the
inode. A readlink(2) call on this file returns a string in
the format:
type:[inode]
For example, socket:[2248868] will be a socket and its inode
is 2248868. For sockets, that inode can be used to find more
information in one of the files under /proc/net/.
Run Code Online (Sandbox Code Playgroud)
然而,这有一个问题。对于管道,读端和写端的索引节点是相同的。对于套接字对 - 不能保证。然而,这很可能是一个 Unix 域套接字,理论上我们可以找到它的文件句柄。根据Stephane Chazelas 的回答,我ss -x在 Ubuntu 18.04 虚拟机上使用 XFCE 来查找问题中带有 .desktop 文件的套接字端点,但稍微修改了代码:
#!/usr/bin/env python3
import sys
import time
import datetime
while True:
sys.stdout.write('########### stdout %s\n' % datetime.datetime.now())
sys.stderr.write('+++++++++++ sdterr %s\n' % datetime.datetime.now())
time.sleep(1)
Run Code Online (Sandbox Code Playgroud)
我确实找到了套接字,它的端点显然指向 systemd 套接字:
adminx@bionicbeaver:~$ ls -l /proc/$(pgrep -f write-to-stdout )/fd/{0,1,2}
lr-x------ 1 adminx adminx 64 Dec 23 09:01 /proc/3773/fd/0 -> /dev/null
lrwx------ 1 adminx adminx 64 Dec 23 09:01 /proc/3773/fd/1 -> 'socket:[27437]'
lrwx------ 1 adminx adminx 64 Dec 23 09:01 /proc/3773/fd/2 -> 'socket:[26621]'
adminx@bionicbeaver:~$ ss -x | grep 27437
u_strESTAB 0 0 /run/systemd/journal/stdout 27438 * 27437
Run Code Online (Sandbox Code Playgroud)
journalctl -f正确的是,使用修改后的代码,您将在代码写入系统日志的输出中看到
Dec 23 09:49:47 bionicbeaver /usr/lib/gdm3/gdm-x-session[1441]: ########### stdout 2019-12-23 09:49:45.726394
Dec 23 09:49:47 bionicbeaver /usr/lib/gdm3/gdm-x-session[1441]: ########### stdout 2019-12-23 09:49:46.734060
Dec 23 09:49:47 bionicbeaver /usr/lib/gdm3/gdm-x-session[1441]: ########### stdout 2019-12-23 09:49:47.734603
Dec 23 09:49:47 bionicbeaver /usr/lib/gdm3/gdm-x-session[1441]: +++++++++++ sdterr 2019-12-23 09:49:45.726459
Dec 23 09:49:47 bionicbeaver /usr/lib/gdm3/gdm-x-session[1441]: +++++++++++ sdterr 2019-12-23 09:49:46.734122
Dec 23 09:49:47 bionicbeaver /usr/lib/gdm3/gdm-x-session[1441]: +++++++++++ sdterr 2019-12-23 09:49:47.734787
Run Code Online (Sandbox Code Playgroud)
请注意,桌面管理器 gdm 负责传递这些消息。/proc如果您按照有关管道的相关问题中的描述执行一些过滤,您将看到多个进程作为客户端连接到同一个套接字,并且 gdm 充当某种服务器。
然而,这并不是一个一致的行为。根据Gille和Stephane 的回答,只有 3.3 以上的内核才能找到套接字对的另一端,正如我之前提到的,由桌面环境/窗口管理器实现来决定如何连接标准流。在另一个基于 Debian 的 Mutter 发行版上,相同的代码仅映射到/dev/null
$ ls -l /proc/$(pgrep -f /var/tmp/write-to-stdout-sterr.py)/fd/{0,1,2}
lr-x------ 1 xie xie 64 Dec 23 16:38 /proc/16975/fd/0 -> /dev/null
l-wx------ 1 xie xie 64 Dec 23 16:38 /proc/16975/fd/1 -> /dev/null
l-wx------ 1 xie xie 64 Dec 23 16:38 /proc/16975/fd/2 -> /dev/null
Run Code Online (Sandbox Code Playgroud)
总之,不要指望它是便携式的。如果您想获取通过桌面条目启动的应用程序的 stdout 或 stderr,请明确说明。
| 归档时间: |
|
| 查看次数: |
130 次 |
| 最近记录: |