【问题标题】:nohup multiple sequential commands not logging outputnohup 多个顺序命令不记录输出
【发布时间】:2018-11-01 21:42:27
【问题描述】:

我有一个 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 第一个执行正在运行,然后完成,然后第二个开始。但问题是输出没有保存到nohup.out 文件中。如果我在终端等待两次执行完成,则会显示以下错误:

nohup:无法运行命令“开始”:没有这样的文件或目录

我在这里做错了什么?

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

【问题讨论】:

    标签: python logging remote-server nohup


    【解决方案1】:

    你的命令:

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2014-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-28
        • 1970-01-01
        • 2010-11-23
        • 1970-01-01
        相关资源
        最近更新 更多