我有这样的文件:
ls
mate30pro5g.py Mathematica.py opencv.py
我知道这个命令可以启动后台任务:
python3 mate30pro5g.py &
现在我想通过这个命令启动多个任务:
ls *.py | xargs -n1 -i python3 {} &
但我发现我只启动了一项后台任务..我错过了什么?
附:请注意我的所有.py
文件都有无限循环..
答案1
问题是&
由调用 shell 解释的,这不会传输到 xargs 。
所以你必须调用 bash 来使用你的 args 执行 python3 。
解决方案:
ls *.py | xargs -n1 -i bash -c 'python3 {} &'
一个例子:
root@debian:/# ls -1d /etc/rc* | xargs -n1 -i bash -c 'sleep 90 & echo {} '
/etc/rc0.d
/etc/rc1.d
/etc/rc2.d
/etc/rc3.d
/etc/rc4.d
/etc/rc5.d
/etc/rc6.d
/etc/rcS.d
root@debian:/# ps faux | grep sleep
root 494 0.0 0.0 4184 704 pts/0 S 20:54 0:00 sleep 90
root 496 0.0 0.0 4184 672 pts/0 S 20:54 0:00 sleep 90
root 498 0.0 0.0 4184 652 pts/0 S 20:54 0:00 sleep 90
root 500 0.0 0.0 4184 648 pts/0 S 20:54 0:00 sleep 90
root 502 0.0 0.0 4184 672 pts/0 S 20:54 0:00 sleep 90
root 504 0.0 0.0 4184 656 pts/0 S 20:54 0:00 sleep 90
root 506 0.0 0.0 4184 648 pts/0 S 20:54 0:00 sleep 90
root 508 0.0 0.0 4184 684 pts/0 S 20:54 0:00 sleep 90
root 510 0.0 0.0 11108 948 pts/0 S+ 20:54 0:00 grep sleep
另一个解决方案,因为您想通过 jobs 管理所有流程。您需要创建一个包含所有命令的大字符串并调用eval
它。
CMD=$( ls *py | xargs -n1 -i echo ' python3 {} & ' )
eval $CMD
或者
eval $( ls *py | xargs -n1 -i echo ' python3 {} & ' )