以前はpythonからlinuxcncを切れなかったのでコマンドでプロセスを切る。
2628 pts/1 00:00:00 linuxcnc
2668 pts/1 00:00:00 linuxcncsvr
2691 ? 00:00:00 rtapi_msgd
2697 ? 00:00:00 rtapi:0
2706 pts/1 00:00:00 io
2725 pts/1 00:00:05 milltask
2726 pts/1 00:00:44 axis
おそらく、下から順番に消すと消える。
特にaxisプロセスを消すと、基本的には全部消してくれる。
import linuxcnc
import subprocess
import time
def getProcesses(str):
processCommand = ["ps", "-A"]
checkProcess = ["grep", "-e", str]
processExec = subprocess.Popen(processCommand, stdout = subprocess.PIPE)
checkExec = subprocess.Popen(checkProcess, stdin = processExec.stdout, stdout = subprocess.PIPE, stderr=subprocess.PIPE)
processesOut, processesErr = checkExec.communicate()
processSplit = processesOut.split()
return processSplit
def checkIo():
ioGrep = getProcesses("io")
for i in range(len(ioGrep) / 4):
if len(ioGrep[4*i + 3]) == 2:
return ioGrep[4*i + 3], ioGrep[4*i]
return False
def checkProcess(str):
retVal = []
strGrep = getProcesses(str)
for i in range(len(strGrep) / 4):
retVal.append([strGrep[4*i + 3], strGrep[4*i]])
return retVal
def killProcess(processId):
killCommand = ["kill", processId]
subprocess.Popen(killCommand)
#linuxcnc, linuxcncsvr, rtapt_msgd, rtapi:0, io, milltask, axis
def cleanLinuxcnc():
if len(checkProcess("axis")) > 0:
for p in checkProcess("axis"):
killProcess(p[1])
time.sleep(20)
if len(checkProcess("linuxcnc")) > 0:
if len(checkProcess("milltask")) > 0:
for p in checkProcess("milltask"):
killProcess(p[1])
if len(checkIo()) != False:
killProcess(checkIo()[1])
if len(checkProcess("rtapi")) > 0:
for p in checkProcess("rtapi"):
killProcess(p[1])
if len(checkProcess("linuxcnc")) > 0:
for p in checkProcess("linuxcnc"):
killProcess(p[1])
cleanLinuxcnc()
前回書いたプログラムでsubprocess.Popenオブジェクトのpidを見てみるとlinuxcncのプロセスIDとなっている。
そのため、これをterminate()しても、axisなど他のプロセスは残る。
今回のようにaxisのプロセスを消す必要がありそう。