pythonでlinuxcncを切る | sy-engのブログ

sy-engのブログ

システムを作りたい。
自分用の記録。

以前は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のプロセスを消す必要がありそう。