2015-02-14 4 views
1

Мне нужно запустить бесконечную петлю bash для background задача мониторинга на удаленном сервере. Я использую Python Paramiko для этой работы и выполнить следующую команду:Запуск бесконечной петли Bash в фоновом режиме с Paramiko

s = paramiko.SSHClient() 
s.load_system_host_keys() 
s.connect(hostname, port, username, password) 
cmd = 'bash -c "while :; do cat /some/file >>/tmp/sca.mon; sleep 1 ; done" &' 
(stdin, stdout, stderr) = s.exec_command(cmd) 

Однако это не работает по какой либо причине. Он просто застрял на линии exec_command. Как заставить paramiko покинуть удаленный сервер, когда он отправляет команду bash фона и запускает следующий, как? Примечание: Я также пробовал nohup bash -c, но он не работает, пока я использую &, чтобы запустить команду, запущенную в фоновом режиме на удаленном сервере.

+0

Кажется мне, что вся необходимая информация находится здесь: http://unix.stackexchange.com/questions/30400/execute -remote-commands-full-detaching-from-the-ssh-connection – KostasT

+0

@KostasT Мне нелегко найти недостающую часть головоломки на этой странице. Не могли бы вы подробнее рассказать? – ARH

ответ

0

Вот как я решил эту проблему (наконец):

s = paramiko.SSHClient() 
s.load_system_host_keys() 
s.connect(hostname, port, username, password) 
cmd = "echo 'while true; do date >> ~/file.txt; sleep 1; done &' >run.sh" 
(stdin, stdout, stderr) = s.exec_command(cmd) 
cmd = "bash run.sh </dev/null >>/dev/null 2>&1" 
(stdin, stdout, stderr) = s.exec_command(cmd) 
s.close() 
1

Казалось бы работать. Я только не указываю оболочку. Также я использую , а true, потому что я не знаком с «пока:» в bash.

s = paramiko.SSHClient() 
s.load_system_host_keys() 
s.connect(hostname, port, username, password) 
cmd = 'while true; do date >> ~/file.txt; sleep 1; done &' 
(stdin, stdout, stderr) = s.exec_command(cmd) 
s.close() 
+0

Я должен использовать 'bash', чтобы он позволил мне убить фоновое задание в будущем командой' killall bash'. В противном случае мне нужно каким-то образом получить PID этого цикла while и использовать 'kill PID' в будущем. Я не знаю, как получить PID в этот момент. Есть идеи ? – ARH

+0

Итак, вы должны попытаться создать команду по информации из предыдущего комментария. О PID - http://stackoverflow.com/questions/7858191/difference-between-bash-pid-and – KostasT

+1

Это звучит разумно. Я могу запустить 'echo $!', Чтобы получить PID последнего фонового задания. Подробнее: http://unix.stackexchange.com/questions/30370/how-to-get-the-pid-of-the-last-executed-command-in-shell-script – ARH