背景
正常逻辑上通过网络远程在另外一台机器执行一个命令后,就跟本机没有关系了,但是事实上并不是这样的,当执行ssh 后,很多时候也会出现远程反馈信息的情况,换句话就是可以通过ssh实现远程执行调用。但是有些时候并不想在执行过程中建立这种联系,也就是客户机向远程服务机下达命令后,就不用管执行结果,断了连续,以至于不用一直等待,毕竟建立网络连接需要消耗资源。
disown
linux 中bg fg kill wait disown suspend基本是一套的命令,其中的disown 命令是为了消除当前tty的用户建立的shell进程与执行命令的联系,但是后台依然能够查看执行的线程,像是换到后台执行。所以disown是不能断掉与远程的命令的联系。一个挂起的命令很难执行这个命令,可以尝试使用"(command)&"的方式使得命令在后台执行;不行就使用python的thread加daemon=True参数,使得主线程不等待子线程,可以使用sleep一段时间来折中这个过程。
kill
解决想法是通过&使得命令到后台运行,然后通过kill断掉进程。这个时候有个疑问就是,断掉客户机的进程,会不会中断远程机的命令?通过以下实验证明,不会!!所以该方法可以实现断了远程执行的联系。使用程序需要使用多进程,然后中断进程尝试实现。
[root@node1 ~]# ssh node2 "sleep 100 &" &
[root@node1 ~]# ps -ef|grep 'sleep 100'
root 1661 1361 0 10:20 pts/0 00:00:00 ssh node2 sleep 100 &
[root@node1 ~]# jobs -l
[1]+ 1661 Running ssh node2 "sleep 100 &" &
[root@node1 ~]# kill -9 1661
[root@node2 ~]# ps -aux|grep sleep
root 1690 0.0 0.0 108052 352 ? S 10:20 0:00 sleep 100