我有一个python脚本,需要几个小时才能完成。我通常把它当作:
python myscript.py arg1 arg2 ... argN 2> log.err > log.out &
我希望有一个shell脚本运行几次相同的python脚本(使用不同的参数)。此脚本必须在第一个脚本终止时启动第二个python脚本,依此类推。我想我应该使用进程的PID并在一些while循环中迭代检查使用sleep。有什么建议?脚本在远程机器中执行,因此我必须将它们放在后台,以便即使我退出也能保证它们继续执行。
答案 0 :(得分:3)
使用一个脚本来逐个运行所有作业而不是背景化python的每个调用。例如:
#!/bin/sh
python myscript.py arg1 arg2 ... argN 2> log.err > log.out
python myscript.py different_args
# etc.
使脚本可执行(chmod +x script.sh
)并从shell运行它,如./script.sh &
也许你应该看看像screen
这样的工具,它会在你注销后保持你的工作正常运行。如果您执行screen ./script.sh
,然后分离(ctrl-a-d
)并注销,您的脚本将继续运行。然后,您可以稍后重新登录并使用screen -r
重新附加。
答案 1 :(得分:0)
例如,您可以使用循环(使用下一个内容制作脚本runner.sh
:
n=0
while read -r line
do
let n++
echo python myscript.py $line #>log.$n.log 2>log.$n.err
done <<ARGS
a1 a2 a3 a4
b1 b2
c1 c2 c3 c4
ARGS
这将dry run
你的python脚本与args
a1 a2 a3 a4
b1 b2
c1 c2 c3 c4
顺序地,例如当前一个结束时。
如果您满意,请从行
中删除echo
和#
echo python myscript.py $line #>log.$n.log 2>log.$n.err
日志文件将按顺序编号... 1..n
。
为什么要在后台运行python
脚本?您始终可以将上述脚本发送到后台,整个序列将在bg
。
如果您需要在注销后运行它,请使用上面的runner.sh
作为
chmod 755 runner.sh
nohup runner.sh
logout
或好多了使用screen
实用程序,您可以从其他位置注销并登录并重新附加会话等等...阅读man screen
。
答案 2 :(得分:0)
制作一个bash脚本?
python first.py
python second.py
答案 3 :(得分:0)
如果您希望一个脚本直接在另一个脚本之后运行,只需删除尾随&
。 &符号告诉bash在后台运行该进程,这允许您并行运行多个进程(一些在后台运行,一些在前台运行)。如果你想按顺序运行它们,你应该在前台运行它们,如下所示:
python myscript.py argX1 argX2 ... argXN 2> logX.err > logX.out
python myscript.py argY1 argY2 ... argYN 2> logY.err > logY.out
这将使用argx参数运行脚本,然后,在完成之后,再次使用argY参数运行相同的脚本。
如果您希望下次执行仅在第一次运行成功时运行,您可以使用双&符号(&&
),如下所示(请注意尾部反斜杠({{ 1}})转义换行符,所以整个事情实际上是一个命令):
\
您可以使用双&符号链接两个以上的命令,但对于较长的脚本,您应该考虑在开头使用python myscript.py argx1 argx2 ... argN 2> logx.err > logx.out && \
python myscript.py argy1 argy2 ... argN 2> logy.err > logy.out
,这将导致bash在第一个错误后停止执行脚本(请参阅{{3 }})