Технически вы можете использовать столько отдельных соединений, сколько хотите, в то время как ваша проблема вызвана простой опечаткой - вы не можете использовать ресурсы только из одного расширения с функциями из другого, что вполне очевидно.
Однако вам следует избегать нескольких подключений от одного и того же сценария, независимо от одного API или другого. Поскольку это будет обременять ваш сервер базы данных и исчерпывать его ресурсы. Итак, хотя технически вы можете, вы не должны смешивать разные расширения в своем коде, за исключением короткого периода рефакторинга.
Вы можете попробовать:
stdin, stdout, stderr = ssh.exec_command('nohup python executefile.py >/dev/null 2>&1 &')
Я попробовал 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:
Я решил свою проблему об убийстве процесса как-то; вы можете проверить это.
exec_command
не выполняет команду в интерактивной оболочке, поэтому «выполнение процесса в фоновом режиме» действительно не имеет смысла.
Если вы действительно хотите сделать это, вы можете использовать команду nohup
, чтобы начать свой процесс, и сохранить его в живых, когда сеанс завершается. Помните, что вы не можете получить stdin, stdout или stderr, когда вы это сделаете, поскольку вы отделяете процесс от оболочки, поэтому перенаправляйте их соответственно.
Вы можете попробовать использовать экран
screen -d -m ping 8.8.8.8
Это будет запуск экрана и пинг 8.8.8.8. Вы можете просмотреть этот экран с помощью
screen -ls
и подключиться с помощью
screen -D <<screen_name>>
Обратите внимание, что экран завершится после завершения команды.
Я пробовал все методы, описанные здесь, и здесь без успеха, и, наконец, понял, что вам нужно использовать каналы вместо того, чтобы использовать 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 и т. д. на самом деле не нужны.