某些终端程序具有退出键安全地停止它们的执行,例如:
Q+Enter
从这个问题我了解到该timeout
命令允许在指定的时间后向程序发送信号,但据我所知,这些信号都不等同于我所指的退出按键。
可以使用以下命令显示信号列表kill -l
:
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
我想在一段时间后将退出按键(echo
字母q
)发送到程序,以便安全地停止程序。
我该怎么做?
答案1
按键和信号是与程序通信的两种不同方式。如果某个程序有一个相当于按键的信号,那是因为该程序的作者就是这样设计的。
终端本身会将一些键转换为信号,例如Ctrl+C转换为 SIGINT。该程序可以更改终端设置以捕获这些击键本身,而不是让终端将它们转换为信号。相同的终端机制允许使用密钥(通常Ctrl+D)转换为输入的末尾(仅当在行首按下该键时)。这不是一个信号:它意味着程序在尝试从终端读取输入时收到文件结束指示。
当终端消失时,内核会向终端中运行的前台程序(如果有)发送 SIGHUP 信号(如果是 shell,则 shell 会将信号重新发送到其前台作业)。 HUP 来自“(调制解调器)挂起”,在现代世界中适用于关闭 GUI 中的终端窗口等情况。许多程序都会捕获此信号并安全关闭,因此如果发送信号比发送输入更方便,您应该尝试这是否适用于您的程序。
答案2
您可以$ consumer << DOCUMENT
在 bash 中使用输入。如果您希望输入具有良好的延迟,您可能需要在将输入的命令传送到程序之前读取(并分析)在线输入的命令。
analyze <<END
<your timed command>