0

ルートとして実行しているプロセスがあり、さまざまなユーザーとして実行するにはスレッドをスピンオフする必要があります。この部分は正常に機能していますが、子プロセスと親プロセスの間で通信する方法が必要です。

いくつかのリスト、辞書、ロック、キューなどでmultiprocessing.Manager()を使用しようとすると、アクセス許可を下げたプロセスで常にアクセス許可拒否エラーが発生します。

これを修正するためにユーザーまたはPIDへのアクセスを許可する方法はありますか?

私が遭遇しているものを表す基本的なコード(rootとして実行):

#!/usr/bin/env python
import multiprocessing, os
manager = multiprocessing.Manager()
problematic_list = manager.list()
os.setuid(43121) # or whatever your user is
problematic_list.append('anything')

結果:

root@liberator:/home/bscable# python asd.py
Traceback (most recent call last):
  File "asd.py", line 8, in <module>
    problematic_list.append('anything')
  File "<string>", line 2, in append
  File "/usr/lib/python2.7/multiprocessing/managers.py", line 755, in _callmethod
    self._connect()
  File "/usr/lib/python2.7/multiprocessing/managers.py", line 742, in _connect
    conn = self._Client(self._token.address, authkey=self._authkey)
  File "/usr/lib/python2.7/multiprocessing/connection.py", line 169, in Client
    c = SocketClient(address)
  File "/usr/lib/python2.7/multiprocessing/connection.py", line 293, in SocketClient
    s.connect(address)
  File "/usr/lib/python2.7/socket.py", line 224, in meth
    return getattr(self._sock,name)(*args)
socket.error: [Errno 13] Permission denied
Traceback (most recent call last):
  File "/usr/lib/python2.7/multiprocessing/util.py", line 261, in _run_finalizers
    finalizer()
  File "/usr/lib/python2.7/multiprocessing/util.py", line 200, in __call__
    res = self._callback(*self._args, **self._kwargs)
  File "/usr/lib/python2.7/multiprocessing/managers.py", line 625, in _finalize_manager
    process.terminate()
  File "/usr/lib/python2.7/multiprocessing/process.py", line 137, in terminate
    self._popen.terminate()
  File "/usr/lib/python2.7/multiprocessing/forking.py", line 165, in terminate
    os.kill(self.pid, signal.SIGTERM)
OSError: [Errno 1] Operation not permitted

最初の例外は、ここで重要なもののようです。

4

1 に答える 1

0

Python (少なくとも 2.6) は、次のように通信するために UNIX ソケットを使用します。

/tmp/pymp-eGnU6a/listener-BTHJ0E

そのパスを取得して、次のようにアクセス許可を変更できます。

#!/usr/bin/env python
import multiprocessing, os, grp, pwd
manager = multiprocessing.Manager()
problematic_list = manager.list()

fullname = manager._address
dirname = os.path.dirname(fullname)

gid = grp.getgrnam('some_group').gr_gid
uid = pwd.getpwnam('root').pw_uid # should always be 0, but you never know

os.chown(dirname, uid, gid)
os.chmod(dirname, 0770)

os.chown(fullname, uid, gid)
os.chmod(fullname, 0770)

os.setgid(gid)
os.setuid(43121) # or whatever your user is
problematic_list.append('anything')

于 2013-02-07T18:10:08.120 に答える