如何在 Linux 上同步命令调用

如何在 Linux 上同步命令调用

这是我需要解决的具体问题(但我的问题不同,所以即使您不知道 fail2ban 是什么,也请继续阅读):

我正在尝试在 Linux 服务器上使用 fail2ban 来禁止对多个服务(ssh、dovecot、apache、postfix 等)的暴力攻击。现在我偶然发现一个问题,fail2ban 似乎同时执行多个 iptables 命令(使用 Python 中的线程),并且这经常失败(尤其是在启动时),iptables 返回“资源暂时不可用。”错误。

我想通过“同步”对 iptables 的调用来解决这些问题。我正在寻找一个可以创建一些互斥/锁定文件的程序,并且只有当可以创建此文件时,它才会启动实际命令并在命令完成后删除互斥文件。如果互斥文件已经存在,则程序将等待互斥文件消失,然后尝试获取它。

使用这样的命令,我可以配置 fail2ban 中的 iptables-actions 相互等待,这样它们就不会同时执行。

我确信已经有这样的程序了,所以我不必自己写。但到目前为止我还没有找到它。

答案1

我自己找到了。我正在寻找的命令名为flock。我能够通过将所有 iptables 调用包装成/etc/fail2ban/action.d/iptables-multiport.conf如下形式来解决我的问题:

flock /var/lock/fail2ban -c "iptables -N fail2ban-<name>"

现在 fail2ban 每次都能正确启动。

答案2

据我所知,使用 flock 是最具可扩展性的方式,特别是当您在 bash 脚本中工作时,您可以依赖的内置函数范围非常有限。kayahr 的回答确实为我节省了很多时间,因为我在并行运行 iptables 命令时遇到了同样的问题。

相关内容