Linux удаленно запускает скрипты, зависает экран и никогда не возвращается к элементам управления

0

У меня есть скрипт на сервере. Если я запускаю его на сервере локально, это не проблема.

<user@server> ~ % restart_forms A 
forms [A] is Restarting
<user@server> ~ %

Однако, если я запущу его удаленно с клиента (другой машины с Linux), это будет так

<user@client> ~ % ssh server /path/restart_forms A
forms [A] is Restarting

Этот экран зависает и никогда не возвращается к элементам управления; Я должен использовать Ctrl + C, чтобы убить скрипт каждый раз, а затем вернуться к элементам управления.

Я знаю, что это, вероятно, связано с вещами stdin, stdout и stderr. Сейчас я попытался запустить этот фон

<user@client> ~ % ssh server /path/restart_forms A &

Также попробовал

<user@client> ~ % ssh server /path/restart_forms A >/dev/null 2>&1 &

Все вышеперечисленное терпит неудачу и дает ту же проблему. (Я не могу создать экран для запуска по некоторым деловым причинам)

У кого-нибудь есть идеи? Спасибо

Обновление: когда я пытаюсь ps -ef | grep restart_forms в клиенте я вижу, что этот скрипт все еще работает в клиенте. Так не должно быть.


источник
Это на самом деле зависает или вы просто не видите подсказку снова? Если вы нажмете Enter, когда он «зависнет», вы снова получите приглашение? Что значит ps скажем работает, когда его "повесили"?
Etan Reisner
Смотрите мое обновление. Сценарий все еще выполняется и никогда не заканчивается. И он все еще зависает, когда я нажимаю ввод.
использование ps faxww и посмотрите, что работает в нижней части дерева из этого процесса, когда оно висит. Я ожидаю, что вы найдете что-то, ожидающее ввода или подобное.
Etan Reisner
делает restart_forms поставить себя на задний план? Если это так, вы не обязательно заметите в приглашении, но ваш ssh не удалось завершить, потому что у него все еще есть активные дочерние процессы
Eric Renouf
@EricRenouf Хорошо. Похоже, вы правы. Как я могу прекратить ssh тогда?

Ответы:

1

Если вам нужно запустить скрипт, который не завершается сам по себе, и вы хотите запустить его поверх чего-то вроде ssh лучше всего запустить его в screen или же tmux сеанс, так что его терминал будет отделен от ssh использует. Сюда, ssh будет свободен для выхода после вызова сценария, и сценарий может продолжаться столько, сколько ему нужно.

Для этого сделайте что-то вроде следующего:

ssh <user>@<host> screen -d -m restart_forms A
Eric Renouf
источник
Я не уверен, что Screen будет работать в нашем случае, потому что нам нужно что-то вводить после запуска скрипта (например, типа «Y»).
Ну можно либо трубу yes в это, если вы уверены, что это то, что вы хотите, или вы можете подключиться к экранной сессии позже, выполнив screen -ls чтобы увидеть запущенные сеансы и screen -x <pid> или дать -S <name> когда вы создаете это сделать screen -x <name> восстановить соединение и получить интерактивную оболочку, в которой эта команда еще работает, или вы можете посмотреть (мне нужно запустить, поэтому я не могу показать это сейчас), как выполнить ssh позже, и вы действительно можете отправить нажатия клавиш существующему screen сессия без участия интерактива
Eric Renouf