Скрипт зависает при использовании Fabric's Connection.run () в фоновом режиме - PullRequest
0 голосов
/ 28 июня 2018

Обзор

Я пытаюсь использовать python fabric для запуска команды ssh от имени root на удаленном сервере.

Команда: nohup ./foo &

foo ожидается, что команда будет работать в течение нескольких дней. Я должен иметь возможность отсоединить foo от удаленного ssh-сеанса фабрики и поместить foo в фоновый режим.

В FAQ по ткани говорится, что вы должны использовать что-то вроде screen или tmux, когда вы запускаете скрипт фабрики (который запускает фоновую команду). Я попробовал это, но мой сценарий ткани все еще висел. foo не висит.

Вопрос

Как использовать фабрику для запуска этой команды на удаленном сервере без зависания скрипта: nohup ./foo &

Подробнее

Это мой сценарий:

#!/bin/sh
# Credit: https://unix.stackexchange.com/a/20895/6766
if "true" : '''\'
    then
    exec "/nfs/it/network_python/$OSREL/bin/python" "$0" "$@"
    exit 127
fi
'''

from getpass import getpass
import os

from fabric import Connection, Config

assert os.geteuid()==0, "ERROR: Must run as root"

for host in ['host1.foo.local', 'host2.foo.local']:
    # Make an ssh connection to the host...
    conn = Connection(host)

    # The script always hangs at this line 
    result = conn.run('nohup ./foo &', warn=True, hide=True)

Я всегда открываю сеанс tmux, чтобы запустить вышеупомянутый скрипт; даже при этом скрипт зависает, когда я добираюсь до conn.run(), выше.

Я запускаю скрипт на ванильной CentOS 6.5 VM; он работает под Python 2.7.10 и Fabric 2.1.

1 Ответ

0 голосов
/ 28 июня 2018

Часто задаваемые вопросы по Fabric неясны ... Я думал, что часто задаваемые вопросы tmux использовались на локальной стороне при выполнении сценария Fabric.

Правильный способ исправить эту проблему - заменить nohup в удаленной команде на screen -d -m <command>. Теперь я могу запустить весь сценарий локально без зависаний (и мне не нужно использовать tmux в локальном выражении).

В явном виде я должен переписать последнюю строку моего сценария в моем вопросе как:

    # Remove &, and nohup...
    result = conn.run('screen -d -m ./foo', warn=True, hide=True)
...