为什么我不能使用Expect脚本启动Redis?

时间:2018-11-18 11:22:26

标签: bash redis expect

我想我可能无法启动Redis是一个简单的原因

----更新-----

@larsks回答了我的问题后,我意识到这是引起我困惑的一个问题:“您以一个交互语句结束它,这使您的控制台与所产生的进程的stdin / stdout一致。redis-server程序不是互动式:它不接受任何控制台输入。”

我再次检查代码,发现正是这段代码使我认为流程陷入困境

#!/usr/bin/expect -f
spawn redis-server
expect "The server is now ready to accept connections"
interact
spawn redis-cli
expect ">"
...

我从没见过redis-cli运行。

但是如果我更改为

#!/usr/bin/expect -f
spawn redis-server
expect "The server is now ready to accept connections"
spawn redis-cli
expect ">"
...
interact //put it in the end.

它按我的预期工作。

顺便说一句,我在这里使用期望的原因是首先确保Redis服务器启动,然后删除一些密钥。

1 个答案:

答案 0 :(得分:2)

您期望第一个示例做什么?您以interact语句结束它,该语句将您的控制台连接到所产生的进程的stdin / stdout。 redis-server程序不是交互式的:它不接受任何控制台输入。当您运行redis-server时,它将达到...

1135:M 18 Nov 13:59:51.634 * Ready to accept connections

...然后停止,等待redis客户端连接并对其进行操作。另外,请注意,我正在使用的Redis版本以Ready to accept connections而不是The server is now ready to accept connections结尾,因此在以下示例中将使用它。

我们可以在期望脚本中添加一个puts命令,以查看它是否不是 实际上卡在任何地方。如果我运行以下命令:

#!/usr/bin/expect -f
spawn redis-server
expect "Ready to accept connections"
puts "redis is running"
interact

我得到输出:

spawn redis-server
1282:C 18 Nov 14:03:33.123 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1282:C 18 Nov 14:03:33.123 # Redis version=4.0.10, bits=64, commit=00000000, modified=0, pid=1282, just started
[...]
1282:M 18 Nov 14:03:33.124 * Ready to accept connections
redis is running

所以我们可以看到它并没有卡在spawn语句中, 甚至在expect语句上也没有。

您的问题中不清楚的是,为什么您甚至使用expect 在这种情况下,由于redis-server不是交互式程序 并且不会产生任何需要自动化的提示。