У меня есть скрипт на сервере. Если я запускаю его на сервере локально, это не проблема.
<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
в клиенте я вижу, что этот скрипт все еще работает в клиенте. Так не должно быть.
ps
скажем работает, когда его "повесили"?ps faxww
и посмотрите, что работает в нижней части дерева из этого процесса, когда оно висит. Я ожидаю, что вы найдете что-то, ожидающее ввода или подобное.restart_forms
поставить себя на задний план? Если это так, вы не обязательно заметите в приглашении, но вашssh
не удалось завершить, потому что у него все еще есть активные дочерние процессыОтветы:
Если вам нужно запустить скрипт, который не завершается сам по себе, и вы хотите запустить его поверх чего-то вроде
ssh
лучше всего запустить его вscreen
или жеtmux
сеанс, так что его терминал будет отделен отssh
использует. Сюда,ssh
будет свободен для выхода после вызова сценария, и сценарий может продолжаться столько, сколько ему нужно.Для этого сделайте что-то вроде следующего:
источник
yes
в это, если вы уверены, что это то, что вы хотите, или вы можете подключиться к экранной сессии позже, выполнивscreen -ls
чтобы увидеть запущенные сеансы иscreen -x <pid>
или дать-S <name>
когда вы создаете это сделатьscreen -x <name>
восстановить соединение и получить интерактивную оболочку, в которой эта команда еще работает, или вы можете посмотреть (мне нужно запустить, поэтому я не могу показать это сейчас), как выполнить ssh позже, и вы действительно можете отправить нажатия клавиш существующемуscreen
сессия без участия интерактива