【问题标题】:How can I tell if a script was run in the background and with nohup?如何判断脚本是否在后台运行并使用 nohup?
【发布时间】:2016-02-04 19:43:29
【问题描述】:

我有一个脚本需要很长时间才能运行,因为它必须处理数千个文件。我想让这个脚本尽可能地万无一失。为此,我想检查用户是否使用 nohup 和 '&' 运行了脚本。前任。 me@myHost:/home/me/bin $ nohup doAlotOfStuff.sh &。我想 100% 确定脚本是使用 nohup 和 '&' 运行的,因为如果脚本因任何原因在中间死掉,这将是一个非常痛苦的恢复过程。

如何检查脚本本身中的这两个关键参数?如果它们丢失了,我怎样才能在脚本运行得更远之前停止脚本,并向用户抱怨他们错误地运行了脚本?更好的是,有没有办法强制脚本在 nohup & 中运行?

编辑:服务器环境是 AIX 7.1

【问题讨论】:

  • 请问您为什么不使用screentmux
  • 它们基本上是终端多路复用器。它们允许您在远程计算机(或本地计算机)中打开一个分离的会话。我强烈建议使用其中之一。 screen 更简单,而tmux 更强大。
  • 嘿,我不小心删除了我之前的评论。这些命令在 AIX 中不起作用,这是我的服务器环境。另外,我觉得好像这不是问题的根本原因。我想让它即使是最愚蠢的用户也不能把脚本弄乱=)
  • 一种简化的方法是为您的命令创建一个alias,类似于alias doAlotOfStuff='nohup doAlotOfStuff.sh &'
  • 使用正确的命令(nohup 等)编写包装脚本并将该脚本传递给用户。

标签: bash shell sh nohup


【解决方案1】:

ps 实用程序可以获取进程状态。进程状态码在前台运行时将包含字符+。没有+ 意味着代码在后台运行。

但是,很难判断后台脚本是否是使用nohup 调用的。几乎不可能依赖nohup.out 的存在,因为用户可以随意将输出重定向到其他地方。

有两种方法可以完成您想做的事情。要么退出并警告用户,要么在后台自动重启脚本。

#!/bin/bash
local mypid=$$
if [[ $(ps -o stat= -p $mypid) =~ "+" ]]; then
    echo Running in foreground.
    exec nohup $0 "$@" &
    exit
fi
# the rest of the script
...

在这段代码中,如果进程有一个状态码+,它会打印一个警告然后在后台重启进程。如果进程在后台启动,它将继续执行其余代码。

如果您喜欢救助并只是警告用户,您可以删除 exec 行。请注意,exitexec 之后不需要。我把它留在那里以防你选择删除exec 行。

【讨论】:

  • 您认为这两种方式中哪一种更可取?
  • 如果您不希望用户运行命令并将输出重定向到 /dev/null 或其他文件为 doAlotOfStuff.sh > /dev/null 2>&1 并且直到第二天他们检查时才知道它实际上已退出重定向输出,那么最好在后台自动重启。
【解决方案2】:

查找脚本是否正在记录到 nohup 的一个好方法是首先检查 nohup.out 是否存在,然后回显它并确保您可以在那里读取它。例如:

echo "complextag"
if ( $(cat nohup.out | grep "complextag" ) != "complextag" );then
    # various commands complaining to the user, then exiting
fi

这是有效的,因为如果脚本的标准输出将转到 nohup.out,它们应该去哪里(或您指定的任何输出文件),那么当您回显该短语时,它应该附加到文件 nohup.out。如果它没有出现在那里,那么脚本是使用 nohup 运行的,你可以责骂他们,也许通过在临时广播文件上使用 wall 命令。 (如果你想让我详细说明,我可以)。

至于是否在后台运行,如果没有运行,请查看 nohup 了解。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-07
    • 2021-02-23
    • 2019-01-25
    • 2021-04-06
    • 2011-03-13
    • 2021-10-15
    • 2013-09-14
    相关资源
    最近更新 更多