同步操作将从 mirrors_bugy/script-server 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
import abcimport loggingimport osimport signalimport subprocessimport threadingfrom react.observable import ReplayObservablefrom utils import os_utilsLOGGER = logging.getLogger('script_server.process_base')class ProcessWrapper(metaclass=abc.ABCMeta):def __init__(self, command, working_directory, all_env_variables: dict):self.process = Noneself.working_directory = working_directoryself.command = commandself.all_env_variables = all_env_variablesself.finish_listeners = []# output_stream is guaranteed to close not earlier than process exitself.output_stream = ReplayObservable()self.notify_finish_thread = Nonedef start(self):self.start_execution(self.command, self.working_directory)read_output_thread = threading.Thread(target=self.pipe_process_output)read_output_thread.start()self.notify_finish_thread = threading.Thread(target=self.notify_finished)self.notify_finish_thread.start()def prepare_env_variables(self):env_variables = dict(**self.all_env_variables)if 'PYTHONUNBUFFERED' not in env_variables:env_variables['PYTHONUNBUFFERED'] = '1'return env_variables@abc.abstractmethoddef pipe_process_output(self):pass@abc.abstractmethoddef start_execution(self, command, working_directory):pass@abc.abstractmethoddef write_to_input(self, value):pass@abc.abstractmethoddef wait_finish(self):passdef get_process_id(self):return self.process.piddef is_finished(self):return self.process.poll() is not Nonedef get_return_code(self):return self.process.returncodedef _write_script_output(self, text):self.output_stream.push(text)def stop(self):if not self.is_finished():if not os_utils.is_win():group_id = os.getpgid(self.get_process_id())os.killpg(group_id, signal.SIGTERM)class KillChildren(object):def finished(self):try:os.killpg(group_id, signal.SIGKILL)except ProcessLookupError:# probably there are no children leftpassself.add_finish_listener(KillChildren())else:self.process.terminate()self._write_script_output('\n>> STOPPED BY USER\n')def kill(self):if not self.is_finished():if not os_utils.is_win():group_id = os.getpgid(self.get_process_id())os.killpg(group_id, signal.SIGKILL)self._write_script_output('\n>> KILLED\n')else:subprocess.Popen("taskkill /F /T /PID " + self.get_process_id())def add_finish_listener(self, listener):if self.is_finished():listener.finished()returnself.finish_listeners.append(listener)def notify_finished(self):self.wait_finish()for listener in self.finish_listeners:try:listener.finished()except:LOGGER.exception('Failed to notify listener: ' + str(listener))def cleanup(self):self.output_stream.dispose()
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。