首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么在Python子进程中调用"ssh -f -N hostname“时PID会改变,当我的程序结束时如何可靠地终止它?

在Python子进程中调用"ssh -f -N hostname"时,PID会改变的原因是"ssh -f -N"命令会创建一个新的后台进程来建立SSH连接并保持它。当你的程序结束时,需要可靠地终止这个子进程。

要实现可靠地终止子进程,可以使用Python的subprocess模块来创建和管理子进程。具体步骤如下:

  1. 导入subprocess模块:import subprocess
  2. 使用subprocess.Popen函数创建子进程,并将"ssh -f -N hostname"作为命令参数传递:process = subprocess.Popen(["ssh", "-f", "-N", "hostname"])
  3. 在需要终止子进程的地方,调用process.terminate()方法来终止子进程:process.terminate()

这样,当你的程序结束时,可以通过调用process.terminate()来可靠地终止"ssh -f -N hostname"子进程。

需要注意的是,process.terminate()方法只发送一个终止信号给子进程,具体的终止时间取决于子进程的响应。如果子进程没有及时终止,你可以尝试使用process.kill()方法来强制终止子进程。

关于"ssh -f -N"命令的含义和用途:

  • 概念:"ssh -f -N"是SSH命令的一种用法,用于在后台建立SSH连接并保持它。
  • 分类:该命令属于远程登录和文件传输类的SSH命令。
  • 优势:使用"ssh -f -N"命令可以在后台建立SSH连接,无需手动输入密码,方便自动化脚本和程序的使用。
  • 应用场景:该命令适用于需要在程序中建立SSH连接并保持连接的场景,例如远程执行命令、文件传输等。
  • 推荐的腾讯云相关产品:腾讯云提供了云服务器(CVM)和云数据库(CDB)等产品,可以用于搭建和管理云计算环境。具体产品介绍和链接地址请参考腾讯云官方文档。

请注意,以上答案仅供参考,具体的解决方案可能因实际情况而异。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Linux下进程相关知识

当一个进程结束时,它所使用资源将被释放给其他进程使用。 3. 进程创建 当创建一个新进程,现有进程基本上会使用称为fork系统调用函数克隆自己。...现在看看你终端,你将看到正在运行进程是你shell,因此系统上有一个运行bash进程。现在请记住,当你运行ps l命令,是从运行bash进程运行。...进程可以使用_exit系统调用退出,这将释放进程用于重新分配资源。因此,当一个进程准备终止,它会用一个叫做终止状态东西让内核知道它为什么终止。通常情况下,状态为0表示进程终止成功。...我们仍然希望能够看到进程如何终止,因此即使进程完成了,内核也会将进程变成僵尸进程进程使用资源仍然被释放给其他进程使用,但是进程仍然有这个僵尸进程条目。...如果查看ps输出PID,则可以/proc目录中找到。 进入其中一个进程并查看该文件: 你能看到进程状态信息以及更详细信息。

1.4K50

Docker竟有这些不为人知bug

这个最顶端进程就是初始进程,其启动系统被内核启动,并负责启动系统其余功能部分。如:SSH 后台程序、Docker 后台程序、Apache/Nginx 和 GUI 桌面环境等等。...内核记录这些“僵尸进程基本信息(PID终止状态、资源占用信息),以确保其父进程之后时间里可以通过“等待”来获取这个子进程信息。"...在上例,操作系统会在 bash 进程终止发送 SIGCHLD 信号以唤醒 sshd 进程,其接收到信号后就“收割”掉了此进程。 ?...但还有一种特殊情况——如果父进程终止了,无论是正常程序逻辑正常终止),还是用户操作导致(比如用户杀死了该进程)——进程如何处理?...当我们运行别人代码,我们如何确保这些程序*并不会*派生出进程并因而堆积大量“僵尸进程”?唯独仅有我们运行着自己代码,同时还对所有的依赖包和依赖包依赖包做严格地审查,才能杜绝这种问题。

4K10

【Linux】进程控制

操作系统又如何介入这个操作呢? 其实操作系统进程创建进程之前,会将页表访问权限字段统一修改成只读,无论是地址空间中哪个区域,都会改成只读,然后再创建进程,这是为什么呢?...可以结合下图进行理解: 进程修改内容前: 进程修改内容后: 拷贝完成后,操作系统会将对应修改内容页表访问权限字段修改成读写(rw),所以说,进程没有进行写入时候,页表访问权限字段都是只读...下面我们开始介绍 exec 系列函数原理,首先我们可执行程序运行起来,变成一个进程,生成 pcb、虚拟地址空间、页表等等,将我们程序代码和数据映射到物理内存,如下图: 当我调用了 exec 系列函数后...,假设我们以上面的 ls 为例,当我们使用 ls 程序替换我们程序时,磁盘上 ls 程序数据和代码替换我们原来程序物理内存数据和代码,当 cpu 继续调度我们进程,就会执行 ls 程序...path 代表目标可执行程序路径和文件名;arg 代表如何执行,即命令行怎么传我们就怎么传,但是这个参数传错了也不会有影响,因为这个接口设计时候防止我们传参传错,自动路径文件名查找正确指令。

12110

【Linux】进程控制

首先,fork 函数是一个系统调用,即 fork 函数是操作系统为我们提供一个操作接口,那么 fork 函数肯定也是由操作系统实现;所以当我调用 fork 函数,其实是 OS 在帮我们创建进程...上面三种进程退出方法都是正常退出,但除了正常退出,进程异常退出,比如 Ctrl C 终止进程,或者程序遇到除0,野指针,空指针解引用等问题: ---- 三、进程等待 1、为什么要进行进程等待...第二个参数为如何执行我们程序,这里我们只需要记住: Linux 命令行程序如何执行我们就如何传参 即可;需要注意是,命令行多个指令是以空格为分隔一整个字符串,而 exec 我们需要对不同选项进行分割... Linux ,我们可以使用 chdir 系统调用改变进程工作目录: 在理解了当前路径是当前进程工作目录之后,我们就可以解释为什么我们 shell 执行 cd 命令后目录不改变了: myshell...是通过创建进程方式去执行命令行各种指令,也就是说,cd 命令是由进程去执行,那么自然被改变也是进程工作目录,父进程工作目录不受影响; 而当我们使用 PWD 指令来查看当前路径

4K00

【Linux】Linux进程控制 --- 进程创建、终止、等待、替换、shell派生子进程理解…

调用fork函数之后,当执行程序代码转移到内核fork代码后,内核需要分配新内存块和内核数据结构给进程,内核数据结构包括PCB、mm_struct和页表,然后构建起映射关系,同时将父进程内核数据结构部分内容拷贝到进程...\n情况下,调用exit程序运行会先睡眠3秒,然后在打印出hello Linux,这是为什么呢?...exec系列函数只有调用失败时候才有返回值,这个返回值是-1,那为什么exec系列函数没有调用成功返回值呢?...当父进程派生进程发生程序替换,防止父子进程原先共享代码段和数据段被修改,操作系统进行写拷贝,将代码段和数据段重新复制一份给进程,让进程程序替换之后,不会影响父进程。...python,shell,c++这些程序都可以进程中进行程序替换。 所以,程序替换,可以调用任何后端语言可执行程序

14.6K30

【Linux修炼】11.进程创建、终止、等待、程序替换

#include pid_t fork(void); //返回值:进程返回0,父进程返回进程id,出错返回-1 那么调用fork函数之前只有一个进程,当进程调用fork,...如何理解fork返回之后,给父进程返回进程pid,给进程返回0? 父亲:孩子 = 1:nn>=1,因此孩子找父亲具有唯一性。...任意地方调用 exit(code)退出 code为退出码,下面就演示一下: 结果显而易见,当我们查看这个进程如何结束,直接观察退出码: 此外,函数内部exit进程直接结束,函数也不会有返回值...通过下面理解: 4.2 理解原理(是什么、为什么、怎么办) 当我们执行代码,就会创建进程地址空间与物理内存磁盘之间形成映射关系,当执行上面的代码就是这样,执行第一个printf照常打印,到了execl...、页表,与父进程共享对应物理内存: 而当进程调用execl,由于进程发生改变,本着进程直之间具有独立性原则,进程就会发生写拷贝,将共享数据段和代码段物理内存另一个位置进行写拷贝,

6.2K00

Linux进程控制——Linux进程等待

前言:接着前面进程终止,话不多说我们进入Linux进程等待学习,如果你还不了解进程终止建议先了解: Linux进程终止 本篇主要内容: 什么是进程等待 为什么要进行进程等待 如何进程等待...获取退出结果 当我程序异常了,exit code 将无任何意义 exit sig : 0则代表没有收到信号 手动杀掉进程获取到信号 但是如果我们每次提取退出信息都要使用繁琐位运算,这很不方便...} 观察进程调度顺序 我们发现明明是按顺序创建进程,但是调度却没有顺序可言,终止时候也没有顺序,因为进程调度完全由调度器说算,所以进程调度先后我们并不确定,这点在前面我们也提到过。...总结拓展 拓展一:父进程如何得知进程退出信息 父进程调用wait()/waitpid()来获取进程退出信息,调用接口就传入了一个status参数,而父进程存在着一个statusp指针...而进程退出,操作系统就会将退出信号和退出码写到进程PCD int exit_code; int exit_signal 而退出信号和退出码将会写到这两个变量当我调用系统调用时,只需要将这两个变量组合写入到变量里

8910

Linux进程控制

一.进程创建 fork()函数: 进程概念这篇文章,我们浅浅地了解了一下fork函数,功能是让父进程去创建一个进程,并且有两个返回值,对应着父进程返回值和进程返回值。...那么,为什么这样?接下来我们好好地讨论一下fork函数。 linuxfork函数非常重要函数,它从已存在进程创建一个新进程。新进程进程,而原进程为父进程。...2.如何理解fork函数返回后,进程返回0,父进程返回进程id? 3.如何理解同一个id值,为什么保存两个不同值,让if  else  if同时执行?...fork()函数,是操作系统提供函数,在用户空间调用fork函数时候,实际上就是调用内核空间中fork函数。fork函数函数主体,就有创建进程相关指令,最后是返回 进程pid。...比如父进程先返回,先写入id,此时id值是进程pid,此时进程id,地址和内容,跟父进程是一样,就是指向了同一个地址。

2.4K30

【Linux】进程控制:理解什么是进程创建,进程终止进程等待 | 进程替换

答案是父进程进程退出,会成为僵尸进程,需要父进程回收。 那么父进程期望获得进程退出得哪些信息呢?...我们知道子进程退出时会变成僵尸进程: 僵尸进程无法被杀死,需要通过进程等待来杀掉,进而解决内存泄漏问题---必须解决 我们要通过进程等待,获得进程退出情况---知道我布置给进程任务,完成怎么样了...等待原理: 其实进程退出时候,会把退出码,终止信号写入到PCB exit_code  和  exit_signal 变量,等待进程,也就是从子进程PCB读取这两个变量值,并写入到输出型变量...进程替换原理: 进程替换,只会替换掉物理内存中原来程序代码和数据,其它并不会动,且调用exec并不创建新进程,所以调用exec前后该进程id并未改变。...所以当我们要put环境变量,只是将它地址填入了环境变量表,而环境变量内容是由我们自己输入我们自己创建命令行参数表,而这个命令行参数表是,但环境变量表依然指向不变,但是其实所指向内容已经变了

24210

日拱一卒,量大管饱,MIT手把手教你配环境

我们同样研究如何使用ssh命令来远程控制机器。 任务控制 一些情况下,你需要终端一个持续运行程序。比如一个命令需要很长时间才能结束(比如在一个巨大文件夹当中使用find搜索)。...我们例子当中,当我们输入Ctrl-C,shell会发送一个SIGINT信号给进程。 这里有一个使用Python来捕获SIGINT信号并且忽视例子,因为捕获了信号,所以不会导致程序停止。...注意,Ctrl终端中会被展示成^。 img 尽管SIGINT和SIGQUIT都是常用终止程序终端请求,一个更常用用来停止程序信号是SIGTERM。...然而如果我们换一个bash会话这种方法就行不通了,因为wait只会在进程当中能够运行。我们note当 没有讨论到一点是kill命令成功时会返回0,失败返回非0。...kill -0将不会发送信号,但会在进程不存 时候返回非0状态。编写一个叫做pidwaitbash函数,接收一个pid,并且等待直到进程结束。

1.4K20

进程控制那些事儿

,也称为交换进程,是内核一部分,并不执行任何磁盘上程序,因此也被称为系统进程;ID=1 通常是 init 进程自举过程结束时由内核调用,该程序程序文件 UNIX 早期版本是 /sbin/...即在调用 fork 处产生两次返回,一次是进程,一次是进程。 但是父、进程返回值却大不相同,父进程返回是成功创建进程 ID;进程返回是 0。...目前大多数系统 exit 实现不在这方面给自己找麻烦,毕竟进程结束时系统自动关闭进程打开所有文件句柄,在库关闭它们,只是增加了开销而不会带来任何益处。...对上面的例子稍加改造,看看在线程 fork 进程如何: #include ".....WNOHANG 在有合适条件进程返回进程 PID终止状态,提供了一种试探能力。

34410

linux下进程控制

unix系统上我们通过fork函数产生一个新进程,这个新产生进程我们称为进程调用fork函数进程则是父进程。..., 如果所有进程都运行,函数默认处于阻塞状态,如果有进程终止,则会返回终止进程pid。...程序重启后可能会出现多个worker进程,导致服务异常。 进程如何感知父进程退出?...一种简单方法是master进程捕捉导致进程退出信号,然后进程退出向worker进程发送一个SIGTERM信号, 这种实现在大多数情况下都能很好工作,但是我们发现当我们用 kill -9 master_pid...(1000); } return 0; } 由于我们程序只会运行在linux平台下, 最终我们采用这种prctl结束时触发SIGKILL信号来结束进程,这种方案代码少,也更好维护。

2.1K20

Python Web学习笔记之并发编程孤儿进程与僵尸进程

当一个 进程完成工作终止之后,进程需要调用wait()或者waitpid()系统调用取得进程终止状态。   ...3、问题及危害 unix提供了一种机制可以保证只要父进程想知道子进程结束时状态信息, 就可以得到。这种机制就是: 每个进程退出时候,内核释放该进程所有的资源,包括打开文件,占用内存等。...任何一个进程(init除外)exit()之后,并非马上就消失掉,而是留下一个称为僵尸进程(Zombie)数据结构,等待父进程处理。这是每个 进程结束时都要经过阶段。...因此,当我们寻求如何消灭系统中大量僵死进程,答案就是把产生大 量僵死进程那个元凶枪毙掉(也就是通过kill发送SIGTERM或者SIGKILL信号啦)。...5、僵尸进程解决办法 (1)通过信号机制 进程退出向父进程发送SIGCHILD信号,父进程处理SIGCHILD信号。信号处理函数调用wait进行处理僵尸进程

64030

100个Linux命令(7)-进程管理

使用-f将匹配命令行 -F, --pidfile file:匹配进程,读取进程pid文件从中获取进程pid值。...lsof -a -c apache -u apache lsof -N:列出所有NFS(网络文件系统)文件 lsof -n:不反解IP至HOSTNAME lsof -i:用以显示符合条件进程情况 lsof...对于cpu 如何选择下一个要执行进程 Linux ,决定下一个要运行进程是通过“调度类”(调度程序)来实现。...创建进程方法以及父子进程 每一个进程都会有一个唯一 PID进程环境下执行或调用程序,这个程序触发进程就是进程进程 PPID 就是该进程进程 PID,由此可知,进程总是由父进程创建...另外,shell后台进程终端被关闭脱离终端,因此也不受shell和终端控制。例如shell脚本后台进程,再如"(sleep 10 &)"。

1.7K20

Linux系统-进程控制

零、前言 前篇我们讲解学习了关于进程概念知识,本章主要讲解关于进程控制,深入学习进程 一、进程创建 1、fork函数 概念: linuxfork函数从已存在进程创建一个新进程进程)...,便以写拷贝方式各自一份副本 为什么数据要进行写拷贝: 进程具有独立性,多进程运行,需要独享各种资源,多进程运行期间互不干扰,不能让进程修改影响到父进程 为什么不在创建进程时候就进行数据拷贝...,并将进程状态设置为非R 当到一定程度,系统唤醒进程进程由等待队列转为运行队列,同时状态变为R 四、进程替换 1、替换原理 用fork创建进程后执行是和父进程相同程序(但有可能执行不同代码分支...) 如果想执行不同程序进程可以调用一种exec函数以执行另一个程序进程调用一种exec函数,该进程用户空间代码和数据完全被新程序替换,从新程序启动例程开始执行 注:调用exec...并不创建新进程,只是将进程代码和数据写拷贝成新程序代码和数据(达到替换效果),所以调用exec前后该进程id并未改变 示图: 2、替换方法 exec系列函数原型: #include <unistd.h

1.5K30

Linux wait() 和 waitpid()函数介绍

进程可以选择忽略该信号,或者提供一个该信号发生即被调用执行函数。对于这种信号系统默认动作是忽略。...现在要知道调用wait或waitpid进程可能会发生什么情况:  如果其所有进程都在运行,则阻塞。 如果一个进程已经终止,正在得带进程获取到终止状态,则取得该进程终止状态立即返回。...当程序运行时候明显可以看到输出最后一行 时候等待了三秒钟。也就是父进程等待进程结束。父进程才能扑捉进程,然后得到wait要得到结果。...Pid==0等待其组ID等于调用进程组ID任一个进程Pid<-1等待其组ID等于pid绝对值任一进程。 Waitpid返回终止进程进程ID。...从结果,我们看到父进程一直等待进程结束。

2.3K50

Linux进程——进程创建(fork原理)

前言:在上一篇文章,我们已经会使用getpid/getppid函数来查看pid和ppid,本篇文章介绍第二种查看进程方法,以及如何创建进程!...本篇主要内容: 查看进程第二种方法 创建进程 系统调用函数fork 开始前,我先来回顾一下如何获取pid,ppid 进程要想区分就一定会有唯一标示符,而pid,ppid初始化后就变为内核数据...查看进程第二种方法 Linux系统,不只有ps能够查看进程,还存在着一个动态目录proc,该目录存放了所有存在进程,目录名称。它会随着进程改变而随时更新内容!...proc查看进程 当我们结束这个进程,文件也从proc中被删除 误删可执行程序时 在看完这个视频后,我们发现当我程序运行时,误删了可执行程序进程不会被终止,但是proc目录exe被标红并注明...创建进程 2.1 系统调用函数fork Linux进程创建方式有两种: 命令行中直接启动进程 通过代码创建 而在用代码创建进程,实则是进行了系统调用,这里我们就得在学习一个系统调用函数

7910

【Linux】进程控制(创建、终止、等待)

&前后台理解 前言 在前文中我们了解了fork函数使用,以及写拷贝机制原理等,并且也学习了什么是僵尸进程,但是并没有具体讲到应如何处理僵尸进程,本次章节将对fork函数以及如何终止进程,还有僵尸进程处理做更为详细探讨...实际上就是int typedef 调用fork函数时候,会分配新内存块和内核数据结构给进程,并将父进程部分数据结构内容拷贝给进程(包括环境变量表)。 ​  ...当调用fork函数之前,父进程独立运行,调用fork之后,执行两个执行流,即父子进程共享fork函数之后代码。...实际上两者共同点就是,两者都是当执行到该语句,就会终止进程,唯一区别就在于exit终止进程之前刷新缓冲区,而_exit则是直接结束进程。...:OS进程退出释放该进程对应内核数据结构+代码和数据(因此,僵尸进程问题解决是必要,否责一直存在,占用系统空间资源,造成内存泄露) 进程等待 进程等待原因 在前文进程状态中讲到了

3.4K40

python3--进程操作--multiprocess模块

python程序进程操作 运行程序就是一个进程。所有的进程都是通过进程来创建。因此,运行起来python程序也是一个进程,那么我们也可以程序再创建进程。...多个进程可以实现并发效果,也就是说,当我程序存在多个进程时候,某些时候,就会让程序执行速度变快。... name为进程名称 方法介绍 1 p.start():启动进程,并调用进程p.run()  2 p.run():进程启动时运行方法,正是调用target指定函数,我们自定义类类中一定要实现该方法...代表p为后台运行守护进程,当p进程终止,p也随之终止,并且设定 为True后,p不能创建自己进程,必须在p.start()之前设置 2 p.name:进程名称 3 p.pid进程pid...fork(linux操作系统创建进程机制),创建进程时候自动 import 启动这  个文件,而在 import 时候又执行了整个文件。

1.3K10

孤儿进程与僵尸进程「建议收藏」

2、基本概念   我们知道unix/linux,正常情况下,进程是通过父进程创建进程创建新进程。...当一个 进程完成工作终止之后,进程需要调用wait()或者waitpid()系统调用取得进程终止状态。   ...任何一个进程(init除外)exit()之后,并非马上就消失掉,而是留下一个称为僵尸进程(Zombie)数据结构,等待父进程处理。这是每个 进程结束时都要经过阶段。...因此,当我们寻求如何消灭系统中大量僵死进程,答案就是把产生大 量僵死进程那个元凶枪毙掉(也就是通过kill发送SIGTERM或者SIGKILL信号啦)。...信号处理函数调用wait进行处理僵尸进程

65410
领券