[Linux] su: cannot set user id: Resource temporarily unavailable

作者在ssh连接MySQL测试服务器时,登录MySQL和切换用户报错。经检查发现是/data/目录所在磁盘满了,该服务器为虚拟机,增加100M空间后可正常切换用户。查看磁盘使用情况,发现/mysqldata目录已100%占满,推测因高并发测试导致binlog日志爆发增长,需清理磁盘。

今天ssh mysql db 测试服务器,进去切换成Mysql帐号报错如下:

 

登陆mysql报错如下:

 

[xxx@xxx-c003db2 ~]$ mysql -uroot -
ERROR 1135 (HY000): Can't create a new thread (errno 11); if you are not out of available memory, you can consult the manual for a possible OS-dependent bug

 

切换进mysql用户进去检查:

[xxx@xxx-c001db2 mysqldata]$ sudo su - mysql
su: cannot set user id: Resource temporarily unavailable

 

 

经过检查,确定是mysql有一个目录/data/磁盘满了,测试服务器是虚拟机,所以让sa给/data/目录增加了100M空间之后,就可以sudo su 进去了:

 



[xxx@xxx-c001db2 mysqldata]$ sudo su - mysql
[mysql@xxx-c001db2 ~]$ 


[mysql@xxx-c001db2 ~]$ df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/Sys-root 1008M  222M  736M  24% /
tmpfs                  16G   12K   16G   1% /dev/shm
/dev/vda1             485M   29M  432M   7% /boot
/dev/mapper/Sys-home  5.0G  146M  4.6G   4% /home
/dev/mapper/Sys-tmp   2.0G   68M  1.9G   4% /tmp
/dev/mapper/Sys-usr   5.0G  794M  3.9G  17% /usr
/dev/mapper/Sys-var   4.0G  526M  3.3G  14% /var
/dev/mapper/Sys-crash
                      4.0G  137M  3.7G   4% /var/crash
/dev/mapper/Sys-log   6.0G  1.7G  4.0G  30% /var/log
/dev/mapper/Sys-audit
                      2.0G   93M  1.8G   5% /var/log/audit
/dev/mapper/Sys-vtmp 1008M   34M  924M   4% /var/tmp
/dev/mapper/Sys-opt   9.9G  424M  9.0G   5% /opt
/dev/mapper/Sys-mysqlbackup
                       62M  5.3M   54M   9% /mysqlbackup
/dev/mapper/Sys-mysqldata
                      130G  124G     0 100% /mysqldata
/dev/mapper/Sys-mysqllog
                      9.9G  152M  9.2G   2% /mysqllog
                       9.5G     0  9.5G   0% /mysqldata/shared

 

呵呵,赶紧去清理磁盘上爆发增长的binlog日志吧,今天tester在做高并发测试。

你看到的错误信息: ``` recv failed: Resource temporarily unavailable errno: 11, Resource temporarily unavailable ``` 这表示你在调用 `recv()` 时返回了 `-1`,并且 `errno == EAGAIN` 或 `errno == EWOULDBLOCK`(值为 `11`)。 --- ## 🧠 这个错误意味着什么? > **这不是一个真正的“错误”**,而是 **非阻塞套接字(non-blocking socket)** 下的一种正常行为。 ### ✅ 具体含义: - 套接字被设置为 **非阻塞模式**; - 当前 **没有数据可读**; - `recv()` 不会阻塞等待数据,而是立即返回 `-1`,并设置 `errno = EAGAIN` 或 `EWOULDBLOCK`。 --- ## 📌 示例代码场景 ```c int flags = fcntl(client_fd, F_GETFL, 0); fcntl(client_fd, F_SETFL, flags | O_NONBLOCK); // 设置为非阻塞 int bytes_read = recv(client_fd, buffer, sizeof(buffer), 0); if (bytes_read == -1) { if (errno == EAGAIN || errno == EWOULDBLOCK) { // 没有数据可读,非阻塞正常现象 printf("No data available yet.\n"); } else { // 真正的错误 perror("recv error"); } } ``` --- ## ✅ 如何处理这个错误? ### 方法一:使用 `select` / `poll` / `epoll` 等待数据到来 在读取前检查套接字是否可读,避免无意义的 `recv()` 调用。 #### 示例(使用 `select`): ```c fd_set read_fds; FD_ZERO(&read_fds); FD_SET(client_fd, &read_fds); struct timeval timeout = {0, 100000}; // 100ms int activity = select(client_fd + 1, &read_fds, NULL, NULL, &timeout); if (activity > 0 && FD_ISSET(client_fd, &read_fds)) { int bytes_read = recv(client_fd, buffer, sizeof(buffer), 0); if (bytes_read > 0) { // 成功读取数据 } } ``` --- ## ✅ 一句话总结: > `recv()` 返回 `-1` 且 `errno == 11 (Resource temporarily unavailable)` 表示当前没有数据可读,**是正常行为**,通常出现在非阻塞套接字中,应结合 `select`、`poll` 或 `epoll` 使用。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值