Подтвердить что ты не робот

Ввод команды в фоновом режиме с помощью Fabric не работает на некоторых хостах

В целях тестирования я запускаю следующую команду с помощью простого инструмента командной строки ssh:

ssh [email protected] "nohup sleep 100 >> /tmp/xxx 2>&1 < /dev/null &"

Это работает как ожидалось, на всех моих хостах: в фоновом режиме создается процесс сна, и ssh заканчивается немедленно.

Я пытаюсь реализовать эту функцию в python с помощью Fabric. Я заканчиваю вызов run. Об этом сообщается в журнале Fabric:

[[email protected]] run: nohup sleep 100 >> /tmp/xxx 2>&1 < /dev/null &

Это именно то, чего я ожидаю. Но если я проверю процессы, запущенные на моем хосте, sleep 100 не является одним из них. Хуже того: проблема возникает только на некоторых моих хостах.

Я также добавил дополнительную информацию, чтобы показать, какой процесс был создан, добавив "\necho $!". к команде, которой должен управлять Fabric. Об этом сообщается:

[[email protected]] run: nohup sleep 100 >> /tmp/xxx 2>&1 < /dev/null &
echo $!
[[email protected]] out: 30935

У меня заканчиваются идеи о том, как отлаживать это, поскольку Fabric сообщает, что процесс был создан, но я не вижу, чтобы какой-либо процесс работал в другом конце. В syslog сообщается, что сеанс ssh открывается и закрывается:

Dec  6 09:12:09 host sshd[2835]: Accepted publickey for user from 67.133.172.14 port 37732 ssh2
Dec  6 09:12:09 host sshd[2838]: pam_unix(sshd:session): session opened for user user by (uid=0)
Dec  6 09:12:10 host sshd[2838]: pam_unix(sshd:session): session closed for user user

Могу ли я каким-то образом увеличить количество протоколирования, которое создает демон ssh, чтобы я мог видеть, по крайней мере, какую команду запрашивается через ssh?

Я знаю, что у Fabric есть некоторые проблемы с запущенными командами в background, но это не похоже на мою проблему. Могут ли быть другие проблемы с процессами Fabric/ssh/background?

ИЗМЕНИТЬ

Я установил dtach для всех своих систем. Версия, упакованная в Ubuntu 8.04, слишком старая и не позволяет вызывать dtach -n поверх ssh (проблемы с терминалом), поэтому мне пришлось загрузить и скомпилировать источники dtach, После этого я смог выполнить свою команду следующим образом: с помощью Fabric:

[user @host] run: dtach -n/tmp/Y sleep 100 → /tmp/xxx 2 > & 1

Это нормально работает на всех хостах. Но это не соответствует моему сценарию, потому что:

  • dtach создает два процесса: один для самого dtach, другой для выполняемого процесса.
  • Я не могу получить pid запускающего процесса.
4b9b3361

Ответ 1

Вероятно, вы столкнулись с печально известной Ткань № 395. Обходным решением для этих проблем является выполнение вашей задачи с помощью pty=False.