在使用Python进行远程服务器操作时,我们经常遇到需要在服务器后台执行持续运行的命令,比如`nohup`。`nohup`命令允许我们在退出终端后仍然保持进程的运行状态,不受SIGHUP信号的影响。然而,在使用Python的paramiko模块通过SSH执行`nohup`命令时,可能会遇到命令不生效的问题。这个问题通常由于命令执行后通道被立即关闭导致。 我们来看一个简单的示例,尝试通过paramiko执行`nohup ping localhost &`: ```python import paramiko import time ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect('192.168.1.2', 22, 'root', '123456') ssh.exec_command('nohup ping localhost & \n') time.sleep(1) ``` 在这个例子中,`ssh.exec_command()`方法执行`nohup`命令后,由于命令执行完后会立刻关闭通道,因此`ping`进程并未持续运行。为了解决这个问题,我们需要保持通道打开,直到`nohup`命令执行完毕,可以使用`invoke_shell()`方法来实现: ```python ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect('192.168.1.2', 22, 'root', '123456') chan = ssh.invoke_shell() chan.send('nohup ping localhost & \n') time.sleep(1) ``` 这里,`invoke_shell()`创建了一个交互式的shell,命令执行不会因通道关闭而终止。注意,命令末尾的回车符(`\n`)是必需的,因为它模拟了键盘输入的回车行为,使得命令能够被正确执行。同时,适当的时间延迟(如`time.sleep(1)`)确保命令有足够的时间开始执行。 补充一点关于paramiko的知识,它是一个用于进行SSH2协议编程的Python库,适用于进行远程服务器控制。在处理远程服务器的阻塞任务时,如长时间运行的Python脚本,`exec_command()`可能会导致阻塞。为了解决这个问题,可以使用`get_transport()`获取底层的传输对象,并通过`open_session()`打开一个新的会话通道,然后在该通道上执行命令: ```python transport = ssh.get_transport() channel = transport.open_session() channel.exec_command('cd ~/ ; nohup python3.6 run_test.py > nohup_test.log 2>&1 &') ssh.close() ``` 此外,对于需要频繁连接多个服务器的情况,可以考虑封装成一个类,例如上面提到的`EasyConnectHandle`类,方便管理和重用代码。这个类接收服务器配置信息,实现连接、执行命令以及断开连接的功能,提高代码的可读性和可维护性。 当通过Python的paramiko模块执行`nohup`命令遇到问题时,可以尝试使用`invoke_shell()`或保持通道打开的方式解决。确保命令的完整性和执行环境,以及适时地处理通道关闭,是解决这类问题的关键。
- 粉丝: 4
- 资源: 916
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助