Установка команд в фоновом режиме с помощью Fabric не работает на некоторых хостах. - PullRequest
16 голосов
/ 06 декабря 2011

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

ssh user@host "nohup sleep 100 >> /tmp/xxx 2>&1 < /dev/null &"

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

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

[user@host] run: nohup sleep 100 >> /tmp/xxx 2>&1 < /dev/null &

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

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

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

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

EDIT

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

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

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

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

1 Ответ

25 голосов
/ 06 декабря 2011

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

...