如何处理流程?

如何处理流程?

我在这里看到过类似的问题,但我没有得到答案。也许是因为我对这一切都不熟悉,只是不明白。我希望我的应用程序主要用作指示器。如果用户再次启动它,它会检查它是否已在运行,如果是,则将所有输入数据提供给该进程并退出。

  • 所以首先我需要检查它是否正在运行。我看到的答案是,你可以在程序启动时创建一个文件,然后检查它是否存在...但如果有人删除它怎么办?我不能直接询问操作系统是否有名为“myApp”的进程吗?
  • 接下来我不太明白的是如何与进程通信。我如何给它输入数据,它会用这些数据做什么?它是否像通过 main() 方法启动新应用程序一样工作?

我正在尝试使用 Quickly 创建它。所以如果你能给我一些 Python 示例或类似内容的链接就太好了。

答案1

实际上有一个名为 python-psutil 的包可以使用 python 代码提供进程信息。

你可以在这里获取包裹http://packages.ubuntu.com/lucid/python-psutil

还有另一个有用的包,名为防扩散安全倡议

PSI 是一个 Python 包,可实时访问进程和其他杂项系统信息,例如架构、启动时间和文件系统。它有一个 Python 风格的 API,该 API 在所有受支持的平台上都一致,但也会在需要时公开特定于平台的详细信息。

更多信息请点击这里:https://bitbucket.org/chrismiles/psi/wiki/Home

另一个链接:https://stackoverflow.com/questions/2703640/process-list-on-linux-via-python

答案2

我发现我确实需要 DBus 来实现我所需要的。因此,以下是我实际需要做的事情:

  1. 检查我的服务是否在 dbus 上
  2. 如果它将我的所有输入变量传递给它并退出
  3. 如果它没有创建我的 dbus 服务并
    在 Python 中启动我的程序它将看起来像这样:


# using quickly...  
#     
#   __init__.py  
# # # # # # # # # # # # #  
import dbus  
import sys  
from gi.repository import Gtk  
# import whatever else you need...  

from my_app import MyAppDBusService
# import whatever else from your app...

def main():
    bus = dbus.SessionBus()

    # Check if my app is running and providing DBus service
    if bus.name_has_owner('com.example.myApp'):
        #if it is running pass the commandline variables to it and exit

        #get my service from DBus
        myService = bus.get_object('com.example.myApp', '/com/example/myApp')
        #get offered method from DBus
        myMethod = myService.get_dbus_method('my_method', 'com.example.myApp')
        #call the method and pass comandline varialbes
        myMethod(sys.argv)
        #exit
        sys.exit(0)
    else:
        #if not running
        #run my DBus service by creating MyAppDBusService instance
        MyAppDBusService.MyAppDBusService()

        #do whatever with sys.argv...
        #...

        Gtk.main()

# MyAppDBusService.py
# # # # # # # # # # # # # #

import dbus
import dbus.service
from dbus.mainloop.glib import DBusGMainLoop
#import whatever else you need...

# use the dbus mainloop
DBusGMainLoop(set_as_default = True)

class MyAppDBusService(dbus.service.Object):
    def __init__(self):
        # create dbus service in the SessionBus()
        dbus_name = dbus.service.BusName('com.example.myApp', bus=dbus.SessionBus())
        dbus.service.Object.__init__(self, dbus_name, '/com/example/myApp')

    # offer a method to call using my dbus service
    @dbus.service.method('com.example.myApp')
    def my_method(self, argv):
        #do whatever with argv...

相关内容