从正在运行的程序中获取变量

时间:2015-10-05 04:23:35

标签: java python linux

我有一个运行了几天的脚本,里面有一个计数器。计数器定期写入文件,是否可以从另一个python脚本,linux命令甚至java中找出计数器的值?

简单python计数器的示例:

import time
import random

a = 0
while True:
    a +=1
    time.sleep(random.random())

我对a在给定时间的价值感兴趣。

1 个答案:

答案 0 :(得分:0)

是的,你可以使用任何IPC method,例如send the counter over a socket

self.request.sendall(json.dumps(dict(counter=a)).encode('ascii'))

如果您想从已经运行的流程中获取无法修改的值,那么您可以尝试attach a debugger

$ sudo gdb python <pid of running process>

要启用特定于python的帮助程序命令,请添加到~/.gdbinit

add-auto-load-safe-path /path/to/python-gdb.py

示例gdb会话可能如下所示:

>>> thread apply all py-list

Thread 1 (Thread 0x7f68ff397700 (LWP 9807)):
   2    import random
   3    
   4    a = 0
   5    while True:
   6        a +=1
  >7        time.sleep(random.random())
>>> py-print a
global 'a' = 83

从另一个Python脚本,您可以在批处理模式下运行gdb:

#!/usr/bin/env python
import shlex
import subprocess

cmd = shlex.split("sudo gdb --batch -ex 'py-print a' python") + [str(pid)]
output = subprocess.check_output(cmd, stderr=subprocess.DEVNULL,
                                 cwd=path_to_python_gdb)
a = int(output.rsplit(b'\n', 2)[-2].rpartition(b' ')[2])