陷阱:使您的bash脚本更健壮

浏览国家网络时,我遇到了一个 有趣的文章 (我将其文字化地介绍到这里,是因为对其进行了详尽的解释),其中的作者向我们展示了如何使Bash脚本更强大 陷阱.

使用陷阱使bash脚本更健壮

假设您有一个bash脚本,该脚本每天每六个小时运行一次,并且在某个时刻崩溃,或者同一脚本同时运行两次。 这两种情况非常令人不舒服,因为它们需要纠正人为干预或在某些时候无法解决,从而使系统处于不一致状态。 解决此问题的方法之一就是使用陷阱。

陷阱是控制bash脚本输出的一种简单有效的方法。 让我们回到相同的初始情况,如果脚本是手动停止的(例如,使用ctrl-c停止),则脚本会中断并返回输出信号

INT

如果结尾为

kill

那么输出将是

TERM.

所有可能的退出代码都可以通过查看

kill -l

但是,最常用的是

INT,TERM,EXIT

例如,如果脚本由以下内容组成:

rsync

最明智的做法是依赖一个不允许脚本同时运行的锁定文件:

LOCK =“ /var/run/rsync.lock”,如果[! -e $ LOCK]; 然后触摸$ LOCK rsync -avz foo bar rm $ LOCK否则回显“ rsync已在运行” fi

用普通西班牙语,上面的脚本检查锁文件是否存在,如果不存在,则创建该锁文件,然后执行相应的命令,最后删除该锁文件。 如果该文件存在,则脚本仅向用户发送一条消息,表明该命令已在运行。

但是,当出现问题时,可能会发生未消除锁定文件的情况,从而破坏了有害的影响。 解决方案非常简单:

LOCK =“ /var/run/rsync.lock”,如果[! -e $ LOCK]; 然后捕获“ rm -f $ LOCK;退出” INT TERM EXIT触摸$ LOCK rsync -avz foo bar rm $ LOCK陷阱-INT TERM EXIT否则回显“ rsync已在运行” fi

该解决方案的特殊性在于该命令被包含在陷阱中,以便在接收到信号时

INT,TERM,EXIT

脚本停止并清除锁定文件。

值得一提的是,在上述脚本中,在验证锁定文件与创建锁定文件之间可能存在竞争情况。 一种可能的解决方案是使用重定向和bash的noclobber模式,该模式不重定向到现有文件:

LOCK =“ / var / run / rsync.lock” if(set -o noclobber; echo $$>“ $ LOCK”)2> / dev / null; 然后捕获'rm -f“ $ LOCK”; 退出$? INT TERM EXIT rsync -avz foo bar rm -f $ LOCK陷阱-INT TERM EXIT else echo“ rsync已经在运行:$(cat $ LCK)” fi

后者的特殊之处在于它使用了noblobber模式,就像我已经说过的那样,并且锁定文件包含正在执行的进程的PID。

还值得一提的是,还有其他解决方案,例如

flock

o

solo

但是在这篇文章中,我想与bash自己的资源分享解决方案。 您可以通过此了解更多有关陷阱的信息 优秀的向导.


发表您的评论

您的电子邮件地址将不会被发表。 必填字段标有 *

*

*

  1. 负责数据:MiguelÁngelGatón
  2. 数据用途:控制垃圾邮件,注释管理。
  3. 合法性:您的同意
  4. 数据通讯:除非有法律义务,否则不会将数据传达给第三方。
  5. 数据存储:Occentus Networks(EU)托管的数据库
  6. 权利:您可以随时限制,恢复和删除您的信息。

  1.   拉斐尔·卡斯特罗(Rafael Castro)

    大! 感谢分享。

  2.   nx

    不错的文章,只需将“ echo“ rsync已经在运行:$(cat $ LCK)”“更改为” echo“ rsync已经在运行:$(cat $ LOCK)”“

    问候

  3.   德兰戈斯

    先生,这是一篇非常有趣的文章! 这我保留。

  4.   华金

    请记住,这是一个非常有用的命令。 我在帖子中发布的脚本中使用了该脚本,以删除该脚本在停止时创建的一些文件。

  5.   丹尼FP

    非常有趣,是的先生。