如何向预期脚本生成的进程发送SIGTSTP信号



我写了一个expect脚本,如下所示:

#!/usr/bin/expect -f
spawn sql "user=xx dbname=xx"
interact

在我进入sql客户端后,我无法通过ctrl + z发送SIGTSTP信号来使当前进程挂起并转到后台。

终端将只显示:

=> ^Z

我应该怎么做才能使ctrl + z达到上述目的?

expect的手册给出了配方:

在交互过程中,使用原始模式,以便所有字符都可以传递到当前进程。如果当前进程没有捕获作业控制信号,则如果发送停止信号(默认情况下为^Z(,它将停止。要重新启动它,发送一个继续信号(例如通过"kill-CONT"(。如果您真的想(通过^Z(向这样的进程发送SIGSTOP,请考虑先生成csh,然后运行程序。另一方面,如果您想向Expect本身发送SIGSTOP,请首先调用解释器(可能使用转义符(,然后按^Z。

因此,您可以执行以下操作:

#!/usr/bin/expect -f
spawn /bin/sh
exp_send "psql hostaddr=xxxx  port=xxxx  user=xx dbname=xxr"
interact

例如,让我们考虑以下名为interact.sh:的交互式shell脚本

#!/bin/sh
read -p "First name: " fname
read -p "Last name: " lname
echo "you entered: $fname $lname"

下面期望名为script.exp的脚本自动执行上一个脚本:

#!/usr/bin/expect -f
spawn /bin/sh
exp_send "./interact.shr"
interact

我们推出了后者:

$ ./script.exp 
spawn /bin/sh
./interact.sh
$ ./interact.sh
First name: Stack
Last name: ^Z  (we entered CTRL-Z here)
[1]+  Stopped(SIGTSTP)        ./interact.sh
sh-4.4$ jobs
[1]+  Stopped(SIGTSTP)        ./interact.sh
sh-4.4$ fg
./interact.sh
Overflow
you entered: Stack Overflow
$ exit
exit
$

最新更新