python - linux中如何控制后台进程

标签 python linux perl scripting adb

我需要在 Linux 中编写一个脚本,它可以使用一个命令启动后台进程并使用另一个命令停止进程。

具体应用是获取android的用户空间和内核日志。

以下命令应该开始记录日志

$ mylogscript start

以下命令应该停止记录

$ mylogscript stop

此外,这些命令不应阻塞终端。例如,一旦我发送启动命令,脚本就会在后台运行,我应该能够在终端上进行其他工作。

关于如何在 perl 或 python 中实现它的任何指示都会有所帮助。

编辑: 已解决:https://stackoverflow.com/a/14596380/443889

最佳答案

我找到了问题的解决方案。解决方案本质上包括在 python 中启动一个子进程,并在完成后发送一个信号来终止该进程。 以下是引用代码:

#!/usr/bin/python

import subprocess
import sys
import os
import signal

U_LOG_FILE_PATH = "u.log"
K_LOG_FILE_PATH = "k.log"
U_COMMAND = "adb logcat > " + U_LOG_FILE_PATH
K_COMMAND = "adb shell cat /proc/kmsg > " + K_LOG_FILE_PATH

LOG_PID_PATH="log-pid"

def start_log():
    if(os.path.isfile(LOG_PID_PATH) == True):
        print "log process already started, found file: ", LOG_PID_PATH
        return
    file = open(LOG_PID_PATH, "w")
    print "starting log process: ", U_COMMAND
    proc = subprocess.Popen(U_COMMAND,
        stdout=subprocess.PIPE, stderr=subprocess.PIPE,
        shell=True, preexec_fn=os.setsid)
    print "log process1 id = ", proc.pid
    file.write(str(proc.pid) + "\n")
    print "starting log process: ", K_COMMAND
    proc = subprocess.Popen(K_COMMAND,
        stdout=subprocess.PIPE, stderr=subprocess.PIPE,
        shell=True, preexec_fn=os.setsid)
    print "log process2 id = ", proc.pid
    file.write(str(proc.pid) + "\n")
    file.close()

def stop_log():
    if(os.path.isfile(LOG_PID_PATH) != True):
        print "log process not started, can not find file: ", LOG_PID_PATH
        return
    print "terminating log processes"
    file = open(LOG_PID_PATH, "r")
    log_pid1 = int(file.readline())
    log_pid2 = int(file.readline())
    file.close()
    print "log-pid1 = ", log_pid1
    print "log-pid2 = ", log_pid2
    os.killpg(log_pid1, signal.SIGTERM)
    print "logprocess1 killed"
    os.killpg(log_pid2, signal.SIGTERM)
    print "logprocess2 killed"
    subprocess.call("rm " + LOG_PID_PATH, shell=True)

def print_usage(str):
    print "usage: ", str, "[start|stop]"

# Main script
if(len(sys.argv) != 2):
    print_usage(sys.argv[0])
    sys.exit(1)

if(sys.argv[1] == "start"):
    start_log()
elif(sys.argv[1] == "stop"):
    stop_log()
else:
    print_usage(sys.argv[0])
    sys.exit(1)

sys.exit(0)

关于python - linux中如何控制后台进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14594324/

相关文章:

linux - 如何在 Linux 中确定显示器/电视的电源状态

perl - pg_dump 单个表——可以在循环中执行吗?

python:导入 libpci 引发 SyntaxError

python - 在 Python 中将列中的数字相加无法正常工作?

linux - 如何通过 Bus、Device、Function 和 Offset 获取物理地址

perl - 在 foreach 循环中死亡时未按良好顺序执行的行

python - 匹配由字符串的开头和结尾或非单词字符绑定(bind)的单词的正则表达式

python - imaplib 代理身份验证

python - 使用 Python 编辑图像

python - 动画在 Python 中不起作用