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