0

あるコマンドを使用してバックグラウンド プロセスを開始し、別のコマンドを使用してプロセスを停止できるスクリプトを Linux で作成する必要があります。

特定のアプリケーションは、Android のユーザー空間とカーネル ログを取得することです。

次のコマンドでログの取得を開始する必要があります

$ mylogscript start

次のコマンドは、ロギングを停止する必要があります

$ mylogscript stop

また、コマンドが端末をブロックしてはなりません。たとえば、開始コマンドを送信すると、スクリプトがバックグラウンドで実行され、ターミナルで他の作業を実行できるようになります。

これを perl または python で実装する方法についての指針は役に立ちます。

編集: 解決済み: https://stackoverflow.com/a/14596380/443889

4

3 に答える 3

1

私は自分の問題の解決策を得ました。解決策には、基本的に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)
于 2013-01-30T03:51:17.933 に答える
0

これにはいくつかの異なる方法があります: 1. シグナル - シグナル ハンドラーを使用し、通常は "SIGHUP" を使用してプロセスを再起動するように通知し ("start")、SIGTERM を使用してプロセスを停止します ("stop")。 )。2. 名前付きパイプまたはその他の IPC メカニズムを使用します。バックグラウンド プロセスには、パイプから単純に読み取る別のスレッドがあり、何かが入ってくるとそれに作用します。この方法は、パイプを開き、メッセージ (「開始」、「停止」、「ログレベル 1 の設定」など) を送信する別の実行可能ファイルを使用することに依存しています。

申し訳ありませんが、私はこれらのいずれも Python で実装していません [そして、実際には何も書いていない perl です]。名前付きパイプ。

編集:私を驚かせたもう1つの方法は、開始時にプログラムを単純にデーモン化し、「停止」バージョンにデーモン化されたプロセスを見つけさせて(たとえば、適切な場所に隠した「pidfile」を読み取ることによって)、SIGTERMを送信することです。終了します。

于 2013-01-30T00:47:08.377 に答える
0

これが perl で行うのに最適な方法かどうかはわかりませんが、たとえば:

system("sleep 60 &")

これにより、端末をブロックすることなく 60 秒間スリープするバックグラウンド プロセスが開始されます。シェルのアンパサンドは、バックグラウンドで何かを行うことを意味します。

いつ停止するかをプロセスに伝える簡単なメカニズムは、特定のファイルの存在を定期的にチェックすることです。ファイルが存在する場合は終了します。

于 2013-01-30T00:47:09.690 に答える