我已经设置 mysql 通过 /etc/mysql/my.conf 在 /tmp/mysql.sock 中创建套接字,但重新启动 mysql 服务器后,套接字文件未显示。如果我将套接字位置更改为 /var/run/mysql/mysql.sock,它会创建它。Lsof 甚至告诉我 mysql 进程在 /tmp/mysql.sock 处打开了一个套接字,但它根本不存在。
我想下面的控制台输出最能描述这一点。
λ paukul [~] → ls -al /tmp
total 12
drwxrwxrwt 8 root root 220 Nov 13 01:55 .
drwxr-xr-x 18 root root 4096 Oct 18 16:03 ..
drwxrwxrwt 2 root root 40 Nov 13 01:54 .font-unix
drwxrwxrwt 2 root root 40 Nov 13 01:54 .ICE-unix
-rw------- 1 paukul paukul 104 Nov 13 01:55 serverauth.HPR12fsB3
drwx------ 3 root root 60 Nov 13 01:54 systemd-private-23e4ad16efb8basdb2eb23b2073-mysqld.service-aio3pf
drwxrwxrwt 2 root root 40 Nov 13 01:54 .Test-unix
srwx------ 1 root root 0 Nov 13 01:54 wpa_ctrl_384-1
-r--r--r-- 1 root paukul 11 Nov 13 01:55 .X0-lock
drwxrwxrwt 2 root root 60 Nov 13 01:55 .X11-unix
drwxrwxrwt 2 root root 40 Nov 13 01:54 .XIM-unix
λ paukul [~] → ps aux | grep mysqld
mysql 323 0.0 0.6 596380 101712 ? Ssl 01:54 0:00 /usr/bin/mysqld --pid-file=/run/mysqld/mysqld.pid
λ paukul [~] → sudo lsof -p 323 | grep sock
[sudo] password for paukul:
mysqld 323 mysql 22u unix 0xffff88040add4600 0t0 15296 /tmp/mysql.sock type=STREAM
λ paukul [~] → grep socket /etc/mysql/my.cnf
socket = /tmp/mysql.sock
socket = /tmp/mysql.sock
答案1
您不应尝试在 /tmp 中放置任何旨在在系统服务之间共享的内容。
它不会起作用,因为 systemd 提供了私人 /tmp 目录对大多数服务来说,这消除了大量潜在的安全漏洞。启动服务时,systemd 会将服务放入容器中,将服务看到的 /tmp 目录更改为,在本例中为 。/tmp/systemd-private-23e4ad16efb8basdb2eb23b2073-mysqld.service-aio3pf/tmp
每次启动服务时,都会随机生成此目录名称。
用于进程间通信的套接字应该放在其他地方,例如/run
(正如您已经做的那样)。