使用taskset启动进程是否会等待其完成?未等待时如何实现串行执行?
问题结论
你当前写的循环逻辑默认就会串行执行任务,不需要额外修改:
- 当你使用
taskset -c [核心列表] 目标命令这种启动新进程的调用方式时,taskset 会主动等待启动的子进程完全执行结束后才会退出,属于阻塞式调用 - shell脚本默认会等待前台运行的命令执行完成,再执行下一行语句,因此你的循环会自动等前一个
processing_intense_task执行完,再选下一个目录启动新任务,不会出现多个任务并行的情况。
补充说明
taskset只有在操作已有运行中进程的亲和性时才会直接返回,对应语法是taskset -c [核心列表] -p [PID],这种场景才不会等待进程结束。
兜底防并行方案
如果担心脚本被重复启动、或者后续调整逻辑时意外触发并行,可以加文件锁做二次保险,修改后的代码如下:
#!/bin/bash # 独占锁文件路径,防止多个任务并行 LOCK_FILE=/tmp/processing_task.lock while : do target_dir=$(select_dir) # 选择待处理的新目录 # 拿锁后再执行任务,执行完自动释放锁 flock -x "$LOCK_FILE" sudo taskset -c 4,5,6,7,8,9,10,11 ./processing_intense_task --dir "$target_dir" done
这个方案即使你不小心同时启动了多个脚本实例,同一时间也只会有一个任务在运行,完全避免并行冲突。
内容的提问来源于stack exchange,提问作者julian bechtold
相关产品推荐
相关产品推荐

