Execute: make running commands asynchronous

This prevents deluge from hanging while it waits
for a command to finish.
This also prevents a deadlock from occuring
(c.f. warning at
 http://docs.python.org/library/subprocess.html#subprocess.Popen.wait)
This commit is contained in:
John Garland 2012-03-01 18:15:09 +11:00
commit b0029517eb

View file

@ -36,7 +36,7 @@
import os import os
import time import time
import hashlib import hashlib
from subprocess import Popen, PIPE from twisted.internet.utils import getProcessValue
from deluge.log import LOG as log from deluge.log import LOG as log
from deluge.plugins.pluginbase import CorePluginBase from deluge.plugins.pluginbase import CorePluginBase
@ -110,15 +110,18 @@ class Core(CorePluginBase):
log.debug("[execute] Running commands for %s", event) log.debug("[execute] Running commands for %s", event)
def log_error(exit_code, command):
if exit_code:
log.warn("[execute] command '%s' failed with exit code %d", command, exit_code)
# Go through and execute all the commands # Go through and execute all the commands
for command in self.config["commands"]: for command in self.config["commands"]:
if command[EXECUTE_EVENT] == event: if command[EXECUTE_EVENT] == event:
command = os.path.expandvars(command[EXECUTE_COMMAND]) command = os.path.expandvars(command[EXECUTE_COMMAND])
command = os.path.expanduser(command) command = os.path.expanduser(command)
log.debug("[execute] running %s", command) log.debug("[execute] running %s", command)
p = Popen([command, torrent_id, torrent_name, save_path], stdin=PIPE, stdout=PIPE, stderr=PIPE) d = getProcessValue(command, (torrent_id, torrent_name, save_path), env=os.environ)
if p.wait() != 0: d.addCallback(log_error, command)
log.warn("Execute command failed with exit code %d", p.returncode)
def disable(self): def disable(self):
self.config.save() self.config.save()