Запуск сервера через exec_command (Paramiko) [дубликат]

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

Однако вам следует избегать нескольких подключений от одного и того же сценария, независимо от одного API или другого. Поскольку это будет обременять ваш сервер базы данных и исчерпывать его ресурсы. Итак, хотя технически вы можете, вы не должны смешивать разные расширения в своем коде, за исключением короткого периода рефакторинга.

3
задан icedwater 10 July 2013 в 02:28
поделиться

5 ответов

Вы можете попробовать:

stdin, stdout, stderr = ssh.exec_command('nohup python executefile.py >/dev/null 2>&1 &') 
3
ответ дан cizixs 20 August 2018 в 23:50
поделиться

Я попробовал transport класс, и это было действительно здорово. Вот код, который я использовал:

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname = "host_ip", username = "un"], password = "up")
channel = ssh.get_transport().open_session()
pty = channel.get_pty()
shell = ssh.invoke_shell()
shell.send("cd /my/directory/; nohup ./exec_name > /dev/null 2>&1 &\n")

Но я до сих пор не знаю, как его убить, используя скрипты python; У меня есть открытый вопрос об этом здесь .

EDIT 1:

Я решил свою проблему об убийстве процесса как-то; вы можете проверить это.

5
ответ дан Community 20 August 2018 в 23:50
поделиться

exec_command не выполняет команду в интерактивной оболочке, поэтому «выполнение процесса в фоновом режиме» действительно не имеет смысла.

Если вы действительно хотите сделать это, вы можете использовать команду nohup, чтобы начать свой процесс, и сохранить его в живых, когда сеанс завершается. Помните, что вы не можете получить stdin, stdout или stderr, когда вы это сделаете, поскольку вы отделяете процесс от оболочки, поэтому перенаправляйте их соответственно.

3
ответ дан JimB 20 August 2018 в 23:50
поделиться

Вы можете попробовать использовать экран

screen -d -m ping 8.8.8.8

Это будет запуск экрана и пинг 8.8.8.8. Вы можете просмотреть этот экран с помощью

screen -ls

и подключиться с помощью

screen -D <<screen_name>>

Обратите внимание, что экран завершится после завершения команды.

0
ответ дан shivram 20 August 2018 в 23:50
поделиться

Я пробовал все методы, описанные здесь, и здесь без успеха, и, наконец, понял, что вам нужно использовать каналы вместо того, чтобы использовать SSHClient непосредственно для вызова exec_command (это не работает в фоновом режиме) :

client = paramiko.SSHClient()
client.connect(
    ip_address, username='root', pkey=paramiko_key, timeout=5)
client.exec_command('python script.py > /dev/null 2>&1 &')

Вы должны создать и использовать канал, это работает в фоновом режиме:

client = paramiko.SSHClient()
client.connect(
    ip_address, username='root', pkey=paramiko_key, timeout=5)
transport = client.get_transport()
channel = transport.open_session()
channel.exec_command('python script.py > /dev/null 2>&1 &')

Так что nohup, dtach, screen и т. д. на самом деле не нужны.

5
ответ дан Community 20 August 2018 в 23:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: