执行iptables规则时失败,出现错误提示 iptables: Resource temporarily unavailable.

问题

  出现此种怪问题,第一反应就是:“发生了什么?我什么都没改。没道理呀。”
   Resource temporarily unavailable.的错误打印对应错误码EAGAIN,就出叫你出现这个错了在试一遍的意思。我的感觉是,iptables规则作为系统全局共享组件,在设置时,内核肯定会有锁机制来解决并发问题。既然如此,那就写个脚本并发iptables试一试看有问题没。

测试脚本

#!/bin/shiptables -t filter -N TESTTTTTTTT1 &
iptables -t filter -N TESTTTTTTTT2 &
iptables -t filter -N TESTTTTTTTT3 &
iptables -t filter -N TESTTTTTTTT4 &
iptables -t filter -N TESTTTTTTTT5 &
iptables -t filter -N TESTTTTTTTT6 &iptables -t filter -X TESTTTTTTTT1 &
iptables -t filter -X TESTTTTTTTT2 &
iptables -t filter -X TESTTTTTTTT3 &
iptables -t filter -X TESTTTTTTTT4 &
iptables -t filter -X TESTTTTTTTT5 &
iptables -t filter -X TESTTTTTTTT6 &

  脚本很简单,创建链,然后删除链。每条规则都放后台执行,运行几遍就能复现iptables: Resource temporarily unavailable.的问题。
  板子上跑起来有问题,想着虚拟机跑下试试,虚拟机跑也有问题,不过虚拟机会有让加-w参数的提示:

Another app is currently holding the xtables lock. Perhaps you want to use the -w option?
Another app is currently holding the xtables lock. Perhaps you want to use the -w option?
Another app is currently holding the xtables lock. Perhaps you want to use the -w option?

  这里已经很明显的告诉我们,多个进程争夺xtables lock,iptables执行失败,可以通过-w参数来让进程在失败时wait一下。

修改方法

  查看虚拟机里面的iptables版本为1.4.21, 板子里面的iptables版本为1.4.4,然后下载了1.4.21的源码下来

1.4.21的锁机制
  通过创建unix域套接字然后bind来实现,但是我本地测试这段代码却有问题。原因在于:域套接字在进程退出后不会销毁该套接字对应的文件,下次bind就会失败,如果调用unlink来处理,套接字文件又会里面被清掉,bind总是成功,无法起到锁的作用。(所以这里不懂1.4.21这一版的原理究竟是啥)
  想来想去,没什么好办法,又下载了最新的iptables源码

1.6.1的锁机制
  通过flock实现。查了下flock,发现这就是我需要的。flock锁的销毁会随着文件描述符销毁而销毁,所以即便进程意外退出了,也不用担心会有锁残留的问题。于是可以写出iptables应用层加锁的代码来:

void xtables_try_lock(void)
{int fd;int i = 0;int sleep_time_ms = 50;int wait_time_sec = 10;int wait_cnt = wait_time_sec*1000 / sleep_time_ms;fd = open(XT_LOCK_NAME, O_CREAT, 0600);if (fd < 0)return;for(i = 0; i < wait_cnt; i++){if(!flock(fd, LOCK_EX | LOCK_NB))return;usleep(sleep_time_ms * 1000);}printf("## BUG! Another app is currently holding the xtables lock long time!\n");return;
}

  把这个锁放在iptables就ok了。

iptables: Resource temporarily unavailable.问题相关推荐

  1. Samba amp; Nginx - Resource temporarily unavailable

    先说说本人的开发环境:Win7 + Editplus + VMware(Centos+Samba+Nginx).用Samba在Centos上把web文件夹(如www)共享,然后在Win7上訪问这个文件 ...

  2. Resource temporarily unavailable 错误

    2019独角兽企业重金招聘Python工程师标准>>> [root@namenode01 backup]# su - app Last login: Tue Apr 26 09:48 ...

  3. python3 报错 Resource temporarily unavailable

    原本python中多进程程序跑得挺好的,后来加了一部分代码,结果在运行到 lock = multiprocessing.Manager().Lock() 这一行时报出了如下错误: [0]Excepti ...

  4. su: cannot set user id: Resource temporarily unavailable

    现象: 切换到domino notes用户时失败,提示:su: cannot set user id: Resource temporarily unavailable su - notes su: ...

  5. WSAEWOULDBLOCK: Resource temporarily unavailable

    SAP手记三:安装过程的三个小错误 1.安装sap.oracle提示swap space不够问题 将你电脑的虚拟内存修改到足够大就可以了: 2.ECC6.0 到IMPORT ABAP出错 不管三七二十 ...

  6. OpenWrt——Could not lock /var/lock/opkg.lock: Resource temporarily unavailable.

    问题描述 root@OpenWrt:~# opkg update Collected errors:* opkg_conf_load: Could not lock /var/lock/opkg.lo ...

  7. v4l打开video设备 ,执行VIDIOC_DQBUF,出现Resource temporarily unavailable 问题

    如果你在执行VIDIOC_DQBUF突然提示以下错误: error: VIDIOC_DQBUF: Resource temporarily unavailable 那么很可能是你使用非阻塞方式打开设备 ...

  8. Could not get lock /var/lib/apt/lists/lock - open (11: Resource temporarily unavailable)

    第一次鼓捣Docker,- - ! 报错: server@ubuntu1987:~$ sudo apt-get update E: Could not get lock /var/lib/apt/li ...

  9. 关于Ubuntu中 E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable)解决方案

    在Ubuntu中,有时候运用sudo  apt-get install 安装软件时,会出现一下的情况 E: Could not get lock /var/lib/dpkg/lock - open ( ...

最新文章

  1. 分布式架构spring mvc +mybatis +shiro+ Activiti +Alibaba Druid
  2. MySQL绿色版的应用
  3. 计算机教师队伍掌握的素质,多措并举,努力打造高素质计算机教师x队伍.doc
  4. springboot默认数据源如何设置连接数_Spring Boot系列之配置数据库连接池
  5. mysql中b树是什么_MySQL优化中B树索引知识点总结
  6. QT 笔记6 | Qt网络编程
  7. PicGo的安装与使用
  8. 基于JAVA实现的图形化页面置换算法
  9. Unity 5如何设置物体透明
  10. 原始混合合成器:Arturia Analog Lab for Mac
  11. 企业微信号发消息给指定成员
  12. 正确率/精度(precision),召回率(recall),F1-score,ROC 曲线,AUC值
  13. 通过URL传参(参数也是URL)
  14. Fiddler的下载与基本使用方法
  15. 用史上最牛学习法自学编程,不香吗?
  16. 为Ubuntu安装Realtek的无线网卡驱动
  17. 解决ACCESS_REFUSED - Login was refused using authentication mechanism PLAIN. For details see the broke
  18. MatLab的双目相机标定和orbslam双目参数匹配
  19. 软件测试:测试用例设计-抽奖功能
  20. 归纳法证明Nicomachus

热门文章

  1. python3 django html 中文乱码_解决django后台管理界面添加中文内容乱码问题
  2. 一个form 如何做两次提交_如何做一个好父母
  3. python群发邮件 不进垃圾箱_实战邮箱群发2000封邮件不进垃圾箱
  4. c++成员声明中的非法限定名_new 一个对象有哪两个过程?很多人在面试中都问住了...
  5. python输入变量输出常量_Python输入input、输出print
  6. matlab norm函数_Matlab测夹角
  7. arraylist从大到小排序_为什么插入排序比冒泡排序更受欢迎?
  8. H3C 典型数据链路层标准
  9. 使用Jquery中ajax实现上传文件
  10. 使用Intellij idea新建Java Web项目(servlet) 原理及初步使用