2016-07-23 204 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修復它! –

相關問題