Вам нужно вызвать timeout
с опцией --foreground
:
timeout --foreground ./test.py
Это требуется только в том случае, если команда timeout
не выполняется из интерактивной оболочки (то есть, если она выполняется из файла сценария).
Цитирование со страницы информации timeout
:
‘--foreground’
Don’t create a separate background program group, so that the
managed COMMAND can use the foreground TTY normally. This is
needed to support timing out commands not started directly from an
interactive shell, in two situations.
1. COMMAND is interactive and needs to read from the terminal for
example
2. the user wants to support sending signals directly to COMMAND
from the terminal (like Ctrl-C for example)
Что в действительности происходит в этом случае, так это то, что матрица (или что-то вызывает) вызывает tcsetattr
, чтобы отключить терминальное эхо. Я не знаю почему, но я предполагаю, что это как-то связано с процессом, используемым (не) для сбора пароля пользователя. (Я только что видел это сразу; я не пытался найти вызов.) Попытка изменить конфигурацию tty из фонового процесса приведет к блокировке процесса, пока он не восстановит контроль над tty, и это то, что происходит.
Этого не происходит, если timeout
не используется, поскольку bash
не создает фоновую группу программ. Я полагаю, что ткань 2 избегает вызова на tcsetattr
.
Вероятно, вы также можете избежать этой проблемы, избегая аутентификации SSH на основе пароля, но я этого не пробовал.
Вы также можете избежать этой проблемы, перенаправив stdin
на /dev/null
(либо в команде timeout
, либо в вызове сценария оболочки.) Если вам не нужно перенаправлять стандартный ввод в удаленную команду ( и вы, вероятно, не), это также может быть полезно.