В целях тестирования я запускаю следующую команду с помощью простого инструмента командной строки 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 запускающего процесса.