我如何判断脚本是否在后台 运行 并且没有 hup?

How can I tell if a script was run in the background and with nohup?

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

如何检查脚本本身中的这两个关键参数?如果它们丢失了,我如何才能在脚本进一步运行之前停止脚本,并向用户抱怨他们 运行 脚本错误?更好的是,有什么办法可以在 nohup &?

中强制脚本 运行

编辑:服务器环境是 AIX 7.1

查找脚本是否记录到 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。如果它没有出现在那里,那么脚本是 nut 运行 使用 nohup 并且你可以责骂他们,也许通过在临时广播文件上使用 wall 命令。 (如果你想让我详细说明,我可以)。

至于在后台运行,如果不是运行ning你应该看看nohup就知道了。

ps 实用程序可以获取进程状态。当 运行 在前台时,进程状态代码将包含字符 +。缺少 + 表示后台代码为 运行。

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

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

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

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

如果您更愿意退出并只是警告用户,您可以删除 exec 行。请注意,exec 之后不需要 exit。我把它留在那里以防万一您选择删除 exec 行。