Почему я не могу использовать ожидаемый скрипт для запуска redis? - PullRequest
0 голосов
/ 18 ноября 2018

Я думаю, должна быть простая причина, почему я не могу запустить redis, как это

---- обновление -----

После того, как @larsks ответил на мой вопрос, я понимаю, что именно этот вопрос вызывает у меня путаницу: «Вы заканчиваете его оператором взаимодействия, который связывает вашу консоль со стандартным вводом-выводом / 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 голосов
/ 18 ноября 2018

Что вы ожидаете от первого примера? Вы заканчиваете его оператором 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 не является интерактивной программой и не выдает никаких запросов, требующих автоматизации.

...