nohup 多个顺序命令不记录输出

nohup multiple sequential commands not logging output

我有一个 python 脚本(需要花费大量时间才能完成执行),我需要 运行 多次更改参数。它是在远程机器上执行的。出于实例和测试目的,采用以下脚本 test.py:

import time

print("\nStart time: {}".format(time.ctime()))
time.sleep(10)
print("End time: {}".format(time.ctime()))

为此我通常使用 nohup。使用以下命令执行一次就可以正常工作:

nohup test.py &

输出正确保存在 nohup.out 文件中。为了按顺序 运行 我做了一些研究并找到了 [this question][1] 并且我想出了以下命令:

nohup $(python test.py; python test.py) &

效果很好。我 运行 命令,快速注销并再次登录,看到 htop 第一次执行 运行ning,然后完成,然后第二个开始。但问题是输出没有保存到 nohup.out 文件中。如果我在终端等待两个执行完成,则会显示以下错误:

nohup: failed to run command 'Start': No such file or directory

我做错了什么?

PS.: 我需要记录输出,因为我需要查看脚本的当前进度,并知道如果它没有正确完成会发生什么错误。因此,如果有一些其他命令可以用来代替 nohup 来记录 python print,那么它也会受到欢迎。

您的命令:

nohup $(python test.py; python test.py) &

将尝试执行脚本的输出。这可能不是您想要的。

您在这里想要的是让 nohup 启动一个命令,该命令将依次执行这两个命令。可以做到这一点的最直接的程序是使用 运行 a child shell:

nohup bash -c "python one.py; python two.py" &

至于更好的方法,您可能需要研究一下 tmux 或 screen。如果您在 tmux/screen 中启动命令,您不仅可以将会话与当前 运行 宁 shell 分离,您还可以稍后重新连接到会话恢复并与程序交互。

nohup 命令被传递了一个实用程序和该实用程序的参数

如果您喜欢 运行 通过 nohup 按顺序执行您的脚本,也许使用 bash 作为实用程序是个不错的主意

nohup bash -c "python ./test.py; python ./test.py"

但是,我建议考虑使用 python 的 logging 包,因为我认为 nohup 是一种解决方法(nohup 仅附加到 nohup.out 如果标准输出是终端.)

此外,还有一种方法是使用队列按顺序管理 运行 任务。
在这里,您不必对 运行 相同的脚本重复两次。然后再在你所拥有的和写一个工人来消费队列之间,我认为你所拥有的更简单¯\_(ツ)_/¯