在另一个终止后运行python脚本

时间:2014-08-03 17:13:58

标签: python shell iteration sleep pid

我有一个python脚本,需要几个小时才能完成。我通常把它当作:

python myscript.py arg1 arg2 ... argN 2> log.err > log.out &

我希望有一个shell脚本运行几次相同的python脚本(使用不同的参数)。此脚本必须在第一个脚本终止时启动第二个python脚本,依此类推。我想我应该使用进程的PID并在一些while循环中迭代检查使用sleep。有什么建议?脚本在远程机器中执行,因此我必须将它们放在后台,以便即使我退出也能保证它们继续执行。

4 个答案:

答案 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 }})