Не пользователь root, как убить подпроцесс в Python 2.4 - PullRequest
2 голосов
/ 12 ноября 2010

Я хочу убить подпроцесс, если время выполнения слишком велико.Я знаю, что должен использовать os.kill или os.killpg.

Однако проблемы возникают, если я не являюсь пользователем root.Например, в моем разработанном графическом интерфейсе я хочу вызвать подпроцесс и os.kill или os.killpg, чтобы убить подпроцесс.Но мой графический интерфейс принадлежит Apache.Поэтому, когда дело доходит до команды os.kill, я получаю сообщение об ошибке:

[type: 
exceptions.OSError value: [Errno 1] Operation not permitted 

И, кроме того, версия моего питона 2.4.3. , поэтому terminate ().не может быть использовано.

Может ли кто-нибудь дать мне несколько идей?

Большое спасибо!

PS Связанная часть моего кода:

timeout=4
subp = subprocess.Popen('sudo %s'%commandtosend, shell=True,preexec_fn=os.setsid, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    while subp.poll() is None:
        time.sleep(0.1)
        now = datetime.datetime.now()
        if (now - start).seconds > timeout:
            os.kill(subp.pid, signal.SIGKILL)
            #os.killpg(subp.pid, signal.SIGKILL)
            break

Ответы [ 2 ]

3 голосов
/ 12 ноября 2010

Ваш подпроцесс работает с привилегиями суперпользователя (потому что вы запускаете его с помощью sudo).Чтобы убить его, вам нужно быть суперпользователем.

Один из вариантов - не использовать os.kill, а запустить 'sudo kill 5858', где 5858 будет PID процесса, порожденного подпроцессом. Открыт.

Стоит также отметить, что если ваша программа позволяет пользователю контролировать commandtosend , вы даете пользователю права суперпользователя на всю машину.

2 голосов
/ 12 ноября 2010

Удалите sudo из команды подпроцесса, если это возможно, что вы должны сделать, потому что вы не должны запускать подпроцесс в пользователе sudo из вашего графического интерфейса, это определенно брешь в безопасности:

subprocess.Popen(commandtosend, shell=True,preexec_fn=os
                 ^^
                 Here don't put sudo

Таким образом, ваш подпроцесс будет запущен с пользователем www-data (пользователем Apache), и вы можете уничтожить его с помощью os.kill(subp.pid, signal.SIGKILL).

Если невозможно удалить sudo (что плохо) из подпроцесса, вам придется выполнить уничтожение следующим образом:

os.system("sudo kill %s" % (subp.pid, ))

Надеюсь, это поможет:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...