我希望在我的机器上运行C
编写的程序,并将其连接到另一台机器上,以杀死在其上运行的程序。
在我的计划中,我尝试过:
system("ssh username@machine.com && pkill sleep && exit");
这会导致我的终端SSH进入远程机器,但它会在那里结束。我也尝试过:
execl("ssh","ssh","username@machine.com",NULL);
execl("pkill","pkill","sleep",NULL);
execl("exit","exit",NULL);
但它不会杀死我运行的虚拟sleep
进程。
我似乎无法弄清楚我的过程有什么问题。
答案 0 :(得分:4)
您的第二个示例不会执行您想要的操作,因为它将执行本地计算机上的每个execl
。 IE它会
ssh usrname@machine.com
pkill
exit
但实际上,除非你用fork
围绕这些,否则第一个execl
如果成功运行将取代当前进程,这意味着第二个和第三个永远不会被调用。 / p>
所以,让我们弄清楚为什么第一个(更有希望的)例子不起作用。
这应该相当于:
/bin/sh -c 'ssh username@machine.com && pkill sleep && exit'
&& exit
是多余的。并且您希望pkill
在远程计算机上运行。因此,你想要的东西:
/bin/sh -c 'ssh username@machine.com pkill sleep'
(注意缺少&&
,因此pkill
在远程计算机上运行。
这意味着你想要:
system("ssh username@machine.com pkill sleep");
如果这不起作用,请检查上面的/bin/sh -c
开始工作的命令。例如,ssh
是否要求输入密码?如果是这样,它就不会起作用。您需要使用公钥。
答案 1 :(得分:0)
总是可以通过ssh运行命令:
kill $(pgrep -o -f 'command optional other stuff')
让您的远程进程处理SIGTERM,它可以在其中进行清理。 (包括杀死它开始的任何进程)
谷歌'man pgrep'看看-o和-f做了什么。 -f对于正确定位信号很重要。 'pgrep'返回带尾随\ n的pid但是在将它传递给'kill'之前不需要将其删除。 你的 艾伦