在10.5上启动daemon IPC以通知多个GUI代理+

2024-09-27 22:28:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个用python编写的LaunchDaemon,它以root权限执行长时间的、资源密集型的后台任务。当它工作时,它需要向多个GUI代理发送状态更新(每个登录的用户一个),我正在努力寻找一个合适的IPC机制。由于守护进程和代理在不同的引导上下文中运行,共享对象将无法工作。我不能让守护进程打开套接字,因为它无法长时间响应,客户端必须轮询更新。我想到的最好的方法是让每个代理打开自己的套接字,守护进程依次向每个代理写入数据,但这充其量看起来并不雅观。还有其他选择吗?哦,它必须在MacOSX10.5及更高版本上工作。你知道吗


Tags: 数据对象方法用户权限客户端代理进程
1条回答
网友
1楼 · 发布于 2024-09-27 22:28:57

最后,我让每个GUI代理在/tmp下创建一个数据报套接字,然后launchdaemon依次向每个代理发送一条消息,并清理过时的套接字:

SOCKET_DIR = "/tmp"
SOCKET_NAME = "se.gu.it.dafgu_migration_status"

status_socket = None

def set_status_menu(status, message):
    global status_socket
    try:
        if status_socket is None:
            status_socket = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
        if status_socket is not None:
            message = serializePlist({
                "DAFGUMigrationStatus": status,
                "DAFGUMigrationMessage": message,
            })
            for item in os.listdir(SOCKET_DIR):
                if item.startswith(SOCKET_NAME):
                    socket_path = os.path.join(SOCKET_DIR, item)
                    logging.debug("Sending message to %s" % socket_path)
                    try:
                        status_socket.sendto(message, socket_path)
                    except socket.error, e:
                        if e[0] == errno.ECONNREFUSED:
                            logging.info("Removing stale socket %s" % socket_path)
                            os.unlink(socket_path)
                        else:
                            logging.warn("Sending to %s failed: %s" % (socket_path, e))
    except BaseException, e:
        logging.debug("Unhandled exception when updating status menu: %s" % e)

完整的实现可以在github上找到:

相关问题 更多 >

    热门问题