假设我有多个文件路径可以从终端运行, 我希望它们在后台并行运行,而不将它们的输出打印到控制台屏幕。 (它们的输出应该保存到 python 文件本身定义的其他日志路径中)。
路径格式如下:
/home/Dan/workers/1/run.py
/home/Dan/workers/2/run.py etc.
当我尝试做一些事情,比如在后台运行一个 worker 时,它似乎起作用了:
例如:cd/home/Dan/workers/1/
和 python run.py >/dev/null 2>&1 &
和 ps -ef |grep python
确实显示了在后台运行的脚本而不打印到控制台,而是打印到其预定义的日志路径。
但是,当我尝试通过 bash 脚本启动它们时,我没有在以下代码之后运行 python 脚本:
#!/bin/bash
for path in /home/Dan/workers/*
do
if [-f path/run.py ]
then
python run.py > /dev/null 2>&1 &
fi
done
知道有什么区别吗? 在 bash 脚本中,我尝试一个接一个地启动多个脚本,就像我只启动一个脚本一样。
最佳答案
#!/bin/bash
for path in /home/Dan/workers/*
do # VV V-added ${}
if [ -f "${path}/run.py" ]
then
python "${path}/run.py" > /dev/null 2>&1 &
# or (cd $path; python run.py > /dev/null 2>&1 &) like Terje said
fi
done
wait
使用 ${path}
而不仅仅是 path
。 path
是变量的名称,但您在测试文件时需要的是存储在 path
中的值。为此,请使用 $
作为前缀。请注意,$path
也适用于大多数情况,但如果您使用 ${path}
,您会更清楚您指的是哪个变量。特别是在学习 bash 时,我建议坚持使用 ${...}
形式。
编辑:将整个名称放在双引号中以防 ${path}
包含任何空格。
关于linux - 从 bash 并行运行多个脚本而不将输出打印到控制台,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39055199/