2016-07-23 239 views
0

我的Raspbian是在我的RPI上运行的Linux发行版。我已经设置了一个使用扭曲的小型套接字服务器,并从iOS应用程序接收某些命令。这些命令是字符串。当我收到“st”时,我开始了一个过程,现在我想在“sp”时杀死它。这是我试过的方式:在Linux上运行的python脚本中杀死一个进程

  1. 进口OS
  2. 二手使用os.system( “... ”)//启动过程
  3. 使用os.system(“ ...”)//来杀死进程

可以说该服务被命名为xyz。 这是我试图杀死它的确切方式:

使用os.system( 'PS AXF | grep的XYZ | grep的-v grep的| awk的 '{打印 “杀” $ 1}' | SH')

但是我有一个语法错误。当我在终端单独尝试时,该线路完美运行。这是一个错误的方式来做到这一点在python脚本?我如何解决它?

回答

0

你需要逃避你的字符串引号:

os.system('ps axf | grep xyz | grep -v grep | awk \'{print "kill " $1 }\' | sh') 

或者使用三报价:

os.system('''ps axf | grep xyz | grep -v grep | awk '{print "kill " $1 }' | sh''') 
+1

流水线是一个shell编程反模式的抓包。你想'pkill'或至少一个正确书面的重新实现。另请参阅[无用的'grep'](http://www.iki.fi/era/unix/award.html#grep)。 – tripleee

0

或者,Popen(...).pid打开进程,然后使用os.kill()

my_pid = Popen('/home/rolf/test1.sh',).pid 
os.kill(int(my_pid), signal.SIGKILL) 

记得在脚本中包含一个shebang(#!/ bin/sh)

编辑: 退一步来说,也许

os.kill(int(my_pid), signal.SIGTERM) 

可能是一个更好的方式来结束进程,它至少给人的过程中更加方便地关闭的机会。

+0

你为什么管道stdout和stderr?为什么“自我”呢? –

+0

@CristianCiupitu修复它! –