【问题标题】:execute script B whenever script A is terminated with CTRL C每当脚本 A 以 CTRL C 终止时执行脚本 B
【发布时间】:2020-03-05 05:51:22
【问题描述】:

所以我有这段使用 GPIO 的代码,在它开始之前它会打开 LED,这样我们就知道脚本被触发并且发生了异常情况。

echo "17" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio17/direction
echo "1" > /sys/class/gpio/gpio17/value

问题是有时人们会在不重置 GPIO 的情况下按下“ctrl c”并退出脚本

我想知道,每当代码被CTRL C 杀死时,有什么方法可以触发某些代码行来执行某些操作

【问题讨论】:

  • 是的。为 SIGINT 设置陷阱。例如trap 'echo do some cleanup' SIGINT
  • 这能回答你的问题吗? BASH - using trap ctrl+c

标签: linux bash


【解决方案1】:

如果你想进行一些清理,设置一个陷阱。对于这种情况,听起来您想在脚本退出时将echo 1 转换为 gpio17/value:

trap 'echo 1 > /sys/class/gpio/gpio17/value' 0

无论脚本如何退出,这都会执行命令。 (除非脚本收到 SIGKILL。对此您无能为力。)

【讨论】:

  • 这条线在哪里重要吗?我可以把它放在脚本的末尾吗?谢谢
  • 如果您主要担心 SIGINT,只需在用户点击ctrl-C 之前执行它。如果在脚本退出前没有执行,则不设置陷阱,不会执行echo
  • 请注意,通常您希望在更改任何需要清理的内容之前设置一个陷阱。例如:trap 'test -n "$tmpfile" && rm -f "$tmpfile"' 0; tmpfile="$(mktemp)"; 是合适的,但 tmpfile="$(mktemp)"; trap 'rm "$tmpfile"' 0; 是错误的,因为存在不会删除文件的竞争条件。 (例如,执行 mktemp,但在设置陷阱之前收到 SIGINT)。
猜你喜欢
  • 2021-10-09
  • 2021-11-23
  • 2017-06-16
  • 2020-10-09
  • 1970-01-01
  • 1970-01-01
  • 2011-12-10
  • 2018-07-15
  • 1970-01-01
相关资源
最近更新 更多