代码之家  ›  专栏  ›  技术社区  ›  Qiulang

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

  •  0
  • Qiulang  · 技术社区  · 7 年前

    我想我不能像这样启动redis的原因很简单

    ----更新-----

    在@larsks回答了我的问题后,我意识到正是这一条导致了我的困惑:“您以一条交互语句结束它,它将您的控制台连接到您生成的进程的stdin/stdout。Redis服务器程序不是交互式的:它不接受任何控制台输入。”

    我再次检查代码,发现正是这个代码让我觉得进程卡住了。

    #!/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.
    

    它按我的预期工作。

    btw使用expect的原因是,首先要确保redis服务器启动,然后删除一些密钥。

    1 回复  |  直到 7 年前
        1
  •  2
  •   larsks    7 年前

    您希望第一个示例做什么?你以一个 interact 语句,将控制台连接到生成的进程中的stdin/stdout。这个 redis-server 程序不是交互式的:它不接受任何控制台输入。当你跑步时 ReDIS服务器 ,它将达到…

    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 命令到Expect脚本,以查看它不是 在任何地方都会被卡住。如果我运行以下程序:

    #!/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 语句。

    你的问题不清楚的是你为什么要使用 期待 在这种情况下,因为 ReDIS服务器 不是交互式程序 不会产生任何需要自动化的提示。

    推荐文章