- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在多处理/线程/子处理方面遇到了很多困难。我基本上想做的是执行我的计算机上可用的每个二进制文件,我编写了一个 python 脚本来执行此操作。但我一直有僵尸进程(“已失效”),如果我的 4 个工作进程都处于这种状态,最终会陷入僵局。我尝试了很多不同的方法,但似乎没有任何效果:(
架构如下:
| \_ python -m dataset --generate
| \_ worker1
| | \_ [thread1] firejail bin1
| \_ worker2
| | \_ [thread1] firejail bin1
| | \_ [thread2] firejail bin2
| | \_ [thread3] firejail bin3
| \_ worker3
| | \_ [thread1] [firejail] <defunct>
| \_ worker4
| | \_ [thread1] [firejail] <defunct>
我创建了 4 个工作线程:
# spawn mode prevents deadlocks https://codewithoutrules.com/2018/09/04/python-multiprocessing/
with get_context("spawn").Pool() as pool:
results = []
for binary in binaries:
result = pool.apply_async(legit.analyse, args=(binary,),
callback=_binary_analysis_finished_callback,
error_callback=error_callback)
results.append(result)
(注意我使用“spawn”池,但现在我想知道它是否有任何用处......)
每个工作人员将创建多个线程,如下所示:
threads = []
executions = []
def thread_wrapper(*args):
flows, output, returncode = _exec_using_firejail(*args)
executions.append(Execution(*args, flows, is_malware=False))
for command_line in potentially_working_command_lines:
thread = Thread(target=thread_wrapper, args=(command_line,))
threads.append(thread)
thread.start()
for thread in threads:
thread.join()
每个线程都会在 firejail 沙箱中启动一个新进程:
process = subprocess.Popen(FIREJAIL_COMMAND +
["strace", "-o", output_filename, "-ff", "-xx", "-qq", "-s", "1000"] + command_line,
stdout=subprocess.PIPE, stderr=subprocess.PIPE, preexec_fn=os.setsid)
try:
out, errs = process.communicate(timeout=5, input=b"Y\nY\nY\nY\nY\nY\nY\nY\nY\nY\nY\nY\nY\nY\nY\nY\n")
# print("stdout:", out)
# print("stderr:", errs)
except subprocess.TimeoutExpired:
# print(command_line, "timed out")
os.killpg(os.getpgid(process.pid), signal.SIGKILL)
out, errs = process.communicate()
我使用 os.killpg() 而不是 process.kill() ,因为由于某些原因,我的 Popen 进程的子进程没有被终止...这要归功于 preexec_fn=os.setsid
它设置了所有后代的 gid。但即使使用这种方法,某些进程(例如 zsh)也会引发僵尸进程,因为看起来 zsh 更改了其 gid,因此我的 os.killpg 无法按预期工作...
我正在寻找一种 100% 确定所有进程都会死亡的方法。
最佳答案
如果您想为此使用 subprocess
模块,则应直接使用 process
对象的 .kill
方法,而不是使用 os
模块。使用communicate
是一个阻塞 Action ;所以Python将等待响应。使用 timeout
参数会有所帮助,但对于许多进程来说会很慢。
import subprocess
cmd_list = (
FIREJAIL_COMMAND
+ ["strace", "-o", output_filename, "-ff", "-xx", "-qq", "-s", "1000"]
+ command_line
)
proc = subprocess.Popen(
cmd_list,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
preexec_fn=os.setsid
)
try:
out, errs = proc.communicate(timeout=5, input=b"Y\n" * 16)
except subprocess.TimeoutExpired:
proc.kill()
out, errs = None, None
ret_code = process.wait()
如果您想在一组进程上以非阻塞循环的方式运行它,那就需要使用poll
。这是一个例子。这假设您有一个要提供给进程创建的文件名
列表和相应的command_lines
。
import subprocess
import time
def create_process(output_filename, command_line):
cmd_list = (
FIREJAIL_COMMAND
+ ["strace", "-o", output_filename, "-ff", "-xx", "-qq", "-s", "1000"]
+ command_line
)
proc = subprocess.Popen(
cmd_list,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
preexec_fn=os.setsid
)
return {proc: (output_filename, command_line)}
processes = [create_process for f, c in zip(filenames, command_lines)]
TIMEOUT = 5
WAIT = 0.25 # how long to wait between checking the processes
finished = []
for _ in range(round(TIMEOUT / WAIT)):
finished_new = []
if not processes:
break
for proc in processes:
if proc.poll():
finished_new.append(proc)
# cleanup
for proc in finished_new:
process.remove(proc)
finished.extend(finished_new)
time.sleep(WAIT)
关于python - 僵尸进程,我们又来了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59769560/
更新:-[NSIndexPath行]:消息发送到已释放实例0x895fe70 当我在设备上运行我的应用程序并进行分析时,它说: 将一个Objective-C消息发送到地址为0xaa722d0的已释放对
我现在大部分时间都在尝试调试我的 Backbone 多页面应用程序以摆脱“僵尸”,但不幸的是没有成功。在今天之前,我什至没有意识到我有一个僵尸问题。我做错了什么? 这是我的区域经理: var re
我确实读过这篇文章:https://blog.phusion.nl/2015/01/20/docker-and-the-pid-1-zombie-reaping-problem/ 设置一些上下文:文章
调试使用 iPhone SDK 3.x 目标构建的应用程序时是否支持 NSZombiesEnabled? 此外,如果支持的话,我可以在哪里获取支持的可能级别的列表吗? 最佳答案 是的,设备和模拟器都支
我正在尝试了解主干,并且目前正在努力尝试僵尸 View 。我已经阅读了很多有关此问题的堆栈溢出信息,但仍然无法解决。 为了简单起见,我设置了两个需要切换的 View (无数据)。 到目前为止,我所做的
我正在尝试使用 psycopg 和多处理插入和更新几百万行。查看 http://initd.org/psycopg/docs/usage.html#thread-and-process-safety
我的应用程序在 Linux 机器上进入僵尸状态,它无法被杀死并且 gdb 无法附加到它,我无法调试。现在我想知道最后调用的函数或回溯,无论如何我可以得到这个吗?/proc/pid/stat 下是否有我
我将我的程序作为守护进程运行。 父进程只等待子进程,当它意外死亡时,fork并再次等待。 for (; 1;) { if (fork() == 0) break; int sig = 0;
注意:我们使用的是 Backbone 1.0.0 我对 Backbone 比较陌生,并且打算通过前同事编写的一些代码。我不是盲目地复制粘贴东西,而是想了解他是如何做事的,这就是我开始思考处理僵尸 Vi
我的 Backbone Marionette 应用程序出现问题,我的 subview 没有被完全破坏。您如何正确销毁要替换为另一个布局/项目 View 的嵌套布局 View ? 我对 Marionet
我有两个应用程序在一个服务器上运行,它们执行 headless (headless)浏览任务。每次浏览时,Xvfb 进程并没有死,而是变成了僵尸。我可以用以下脚本确认这一点。 require 'hea
我正在尝试使用 Marionet 模块来玩 Backbone。 例如。实现“加载微调器”,正如 David Sulc 在“contact manager”应用程序中所做的那样,Firefox 的“ba
当我尝试使用 Xcode 菜单(Product - Archive)直接存档项目时,效果很好。但是当我尝试从集成菜单 (bot) 执行它时,出现了这个错误: Build operation faile
我有一个从 nib 构建的 MainWindow 类,设置如下: - (void)applicationDidFinishLaunching:(UIApplication *)application
我关注 this answer跟踪我的应用的 EXC_BAD_ACCESS。是的,我有一个僵尸物体。当我试图找出哪一行代码是错误的时,我发现所有负责任的图书馆都是基金会的。 当我尝试这样做时: Whe
我是 iOS 开发的新手,非常感谢您帮助我找出我遇到的错误的根本原因。 我尝试使用 Instruments(即 Allocations-Zombie Profiler)调试错误,但我无法理解所呈现的调
我是一名优秀的程序员,十分优秀!