我是一名Linux shell脚本编写者,我想知道是否有可能为脚本睡眠发送trap
信号:
那就是Ctrl+z?
我现在这样做,也想捕捉睡眠信号。
# define functions to handle signals
# treat them as errors with appropriate messages
sighup() { print_error_and_exit "trap()" "Caught SIGHUP (1). Terminating. Bye!"; }
sigint() { print_error_and_exit "trap()" "Caught SIGINT (2). Terminating. Bye!"; }
sigquit() { print_error_and_exit "trap()" "Caught SIGQUIT (3). Terminating. Bye!"; }
sigabrt() { print_error_and_exit "trap()" "Caught SIGABRT (6). Terminating. Bye!"; }
sigterm() { print_error_and_exit "trap()" "Caught SIGTERM (15). Terminating. Bye!"; }
# use the above functions as signal handlers;
# note that the SIG* constants are undefined in POSIX,
# and numbers are to be used for the signals instead
trap 'sighup' 1; trap 'sigint' 2; trap 'sigquit' 3; trap 'sigabrt' 6; trap 'sigterm' 15
其中print_error_and_exit
函数的作用正如其名称所示。
目标:如果在终端上键入,我希望忽略此信号(显然这很重要)。
要忽略从终端键入的Ctrl+Z,可以执行:
trap '' TSTP
# or possibly equivalently
trap '' 18
trap '' 20
trap '' 24
正如其他人所指出的,还有其他信号不能被阻止,比如SIGKILL和SIGSTOP。
许多shell将Ctrl+\映射到SIGKILL,将Ctrl+ C 编者按: 您不能在POSIX shell脚本中使用 即使您确实知道您的终端发送的确切信号号,如果编写通用脚本,您也应该阻止这三种可能性。 ShellCheck警告,我引用: 意味着这些信号号在不同平台之间可能会有所不同,尝试SIGTERM为15,您将不会看到任何警告,因为该信号是POSIX标准化的。呃,你可能想在用测试代码后禁用这些 wiki链接:https://github.com/koalaman/shellcheck/wiki/SC2172stty -a
应该显示发送"susp"(SIGTSTP)、"intr"(SIGINT)和"quit"(SIGKILL)的设置。如果需要,用户可以反弹这些按键。SIGTSTP
假名。Trapping signals by number is not well defined. Prefer signal names. [SC2172]
# shellcheck disable=SC2172