可能重复:
/proc/PID/fd/X 链接号
我有一个关于文件描述符及其在 proc 文件系统中的链接的问题。我观察到,如果我从 proc 列出某个进程的文件描述符,ls -la /proc/1234/fd我会得到以下输出:
lr-x------ 1 root root 64 Sep 13 07:12 0 -> /dev/null
l-wx------ 1 root root 64 Sep 13 07:12 1 -> /dev/null
l-wx------ 1 root root 64 Sep 13 07:12 2 -> /dev/null
lr-x------ 1 root root 64 Sep 13 07:12 3 -> pipe:[2744159739]
l-wx------ 1 root root 64 Sep 13 07:12 4 -> pipe:[2744159739]
lrwx------ 1 root root 64 Sep 13 07:12 5 -> socket:[2744160313]
lrwx------ 1 …Run Code Online (Sandbox Code Playgroud) socat 可用于监控跨 Unix 域套接字的流量:
sudo mv /path/to/sock /path/to/sock.original
sudo socat -t100 -x -v UNIX-LISTEN:/path/to/sock,mode=777,reuseaddr,fork UNIX-CONNECT:/path/to/sock.original
Run Code Online (Sandbox Code Playgroud)
我不太明白这个机制是如何工作的,希望有人能解释一下。特别是,如果进程已经在侦听套接字文件,移动套接字文件如何工作?此外,在移动之后:既不lsof /path/to/sock也不/path/to/sock.original返回任何结果。
我正在尝试/run/gunicorn为一些 Gunicorn 套接字/PID 文件创建一个运行时文件夹,这些文件用于 Django 应用程序。如果我手动创建目录,我可以让一切正常。但是,我正在尝试使其成为一个健壮的设置,并最终使用 Ansible 来自动化一切。
我想我有 2 个选项,基于这个问题。
选项 1 - 运行时目录
我认为第一个选项是RuntimeDirectory=在我的 systemd 服务文件中使用,但我无法使用它来创建文件夹。服务文件包含:
#/etc/systemd/system/gunicorn_django_test.service
[Unit]
Description=gunicorn_django daemon
After=network.target
[Service]
User=gunicorn
Group=www-data
RuntimeDirectory=gunicorn #This line is supposed to create a directory
RuntimeDirectoryMode=755
PIDFile=/run/gunicorn/django_test_pid
WorkingDirectory=/vagrant/webapps/django_venv/django_test
ExecStart=/vagrant/webapps/django_venv/bin/gunicorn --pid /run/gunicorn/django_test_pid --workers 3 --bind unix:/run/gunicorn/django_test_socket django_test.wsgi --error-logfile /var/log/gunicorn/django_test_error.log
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
当我运行时systemctl start gunicorn_django_test.service,服务无法启动。当我剪掉 exec 行并手动运行它时,我得到Error: /run/gunicorn doesn't exist. Can't create pidfile.如果我 …
要从文件描述符 6 中读取,我可以使用<&6或</dev/fd/6(又名/proc/self/fd/6)。通常两者都同样有效。但是,如果该文件描述符恰好是套接字,则会发生奇怪的事情。例如:
$ bash -c 'ls -l /dev/fd/6;cat /dev/fd/6' 6</dev/tcp/localhost/12345
lrwx------ 1 michas michas 64 Jan 10 19:50 /dev/fd/6 -> socket:[315010]
cat: /dev/fd/6: No such device or address
Run Code Online (Sandbox Code Playgroud)
这里ls显示描述符确实存在。但是无法通过这种方式访问数据。如果我cat <&6改用一切正常。
两种访问文件描述符的方式有什么区别?
如果在变量中给出数字,是否有一种访问描述符的好方法?(</dev/fd/$fd会起作用,但<&$fd不会。)
(上述情况可以在 linux 上观察到,但在 OpenBSD 上不能观察到。- 似乎该文件描述符是那里的常规字符设备。)
有没有人知道使用本地 unix 套接字进行进程间通信的吞吐量基准/测量?
我想说明在与从数据库请求数据的软件相同的服务器上拥有本地数据库实例的性能优势,而不是必须通过网络链接进行通信,尤其是像千兆以太网这样的网络链接,我预计它会很慢相对而言。
在网上搜索时,我发现一些基准显示每秒的操作数,但没有显示每秒的吞吐量(即 12GB/s)。
我知道性能会因诸如给定系统上的内存吞吐量或其他硬件特性等因素而有所不同,但只需要一个粗略的想法。
这不是指本地 TCP 性能或与之比较。
在 Linux 上,一个进程是否可以在另一个打开的套接字中写入?
假设我使用 netcat 打开与 google.com 的连接:
myuser@linux:~$ nc google.com 80
Run Code Online (Sandbox Code Playgroud)
现在我可以查找进程 pid 并打开其文件描述符文件夹:
myuser@linux:~$ ls -la /proc/24105/fd
totale 0
dr-x------ 2 myuser myuser 0 2012-03-10 19:01 .
dr-xr-xr-x 7 myuser myuser 0 2012-03-10 19:01 ..
lrwx------ 1 myuser myuser 64 2012-03-10 19:02 0 -> /dev/pts/12
lrwx------ 1 myuser myuser 64 2012-03-10 19:02 1 -> /dev/pts/12
lrwx------ 1 myuser myuser 64 2012-03-10 19:01 2 -> /dev/pts/12
lrwx------ 1 myuser myuser 64 2012-03-10 19:02 3 -> socket:[3947162]
Run Code Online (Sandbox Code Playgroud)
所以现在我想使用该套接字内的回声发出 HTTP 请求: …
我知道这/etc/security/limits.conf为几个值提供了持久的软限制和硬限制。
但是,在相关列表中没有说明对以下方面施加的限制:
a) 并发打开的 tcp 连接
b) Unix 域套接字的数量
任何人都可以在哪里以及如何设置/获取这些?
这些价值观是否以某种方式相互关联?
我正在尝试用 C 实现套接字编程。当我尝试从客户端连接到服务器 (Ubuntu) 时,它显示了一个类似“连接失败”的错误。
所以我认为问题出在端口上。我正在使用 5454/tcp 端口进行套接字编程。
如何知道 5454 端口是否正在侦听?如果不是,那么我可以使用哪些端口在 Ubuntu 中使用 C 进行 TCP 套接字编程?是仅端口问题还是我的代码有问题或 LINUX Ubuntu 中需要任何设置?
编辑: 代码片段:
int socket_send;
struct sockaddr_in address;
printf("\n Initialization Socket....");
socket_send = socket(AF_INET,SOCK_STREAM,0);
if(socket_send == -1)
{
perror("\n Socket not created.Error:");
return 1;
}
printf("\n Socket created");
address.sin_family=AF_INET;
address.sin_addr.s_addr=inet_addr(ip);
address.sin_port=htons(5454);
if(connect(socket_send,(struct sockaddr*)&address,sizeof(struct sockaddr))<0)
{
perror("\nConnetion failed.Error:");
return 1;
}
printf("\n Connected");
if(send(socket_send,(char*)buffer,size,flag)<0)
{
perror("\nSending failed.Error:");
return 1;
}
printf("\n Data successfully sent");
close(socket_send);
Run Code Online (Sandbox Code Playgroud)
编辑:问题出在端口上,所以我刚刚重新安装了 Ubuntu,它正在运行。谢谢大家。
问题背景
最近,我在服务器上启动缓慢时遇到了一些麻烦,有时启动时卡在“启用本地文件系统配额:”上超过 2 个小时。
搜索后,我设法将其范围缩小到 /etc/rc.d/rc.sysinit :
# Clean up various /tmp bits
[ -n "$SELINUX_STATE" ] && restorecon /tmp
rm -f /tmp/.X*-lock /tmp/.lock.* /tmp/.gdm_socket /tmp/.s.PGSQL.*
rm -rf /tmp/.X*-unix /tmp/.ICE-unix /tmp/.font-unix /tmp/hsperfdata_* \
/tmp/kde-* /tmp/ksocket-* /tmp/mc-* /tmp/mcop-* /tmp/orbit-* \
/tmp/scrollkeeper-* /tmp/ssh-* \
/dev/.in_sysinit
Run Code Online (Sandbox Code Playgroud)
启动缓慢的确切原因是rm -rf /tmp/orbit-*由于生成了真正大量的套接字文件,并且除了启动之外没有被删除。
这些文件归用户和 GDM 组所有,并命名为 linc-rand-0-longrandom
例如:linc-1e33-0-54b542d8de62e
文件数至少有一次增加到 100 万个。
文件夹的大小也被记录为最大 3.1GB。
注意:套接字文件本身是空的,但是每个文件根据文件系统类型和设置保留最少的磁盘空间。
(通常为 2048 或 4096)
虽然我有一个临时解决方案(见下文),但我非常想找出原因。
这让我想到
问题:
注意事项和系统信息:
这是一个简单的 Unix 回显服务器,使用 nc:
mkfifo fifo
cat fifo | nc -k -l 4458 -v | cat >fifo
Run Code Online (Sandbox Code Playgroud)
(基于此)
正如我所见,数据流的工作原理如下:
fifo (my named pipe)
|
| (using cat)
|
v
nc
|
| (using cat)
|
v
fifo
Run Code Online (Sandbox Code Playgroud)
这里有一个问题:为什么这不起作用?
nc -k -l 4458 -v >fifo <fifo
Run Code Online (Sandbox Code Playgroud)
你会发现,如果试图telnet以localhost对4458,你会得到一个“连接被拒绝”的错误。