如何判断脚本是在后台运行还是使用nohup?

时间:2016-02-04 19:43:30

标签: bash shell sh nohup

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

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

中运行

编辑:服务器环境是AIX 7.1

2 个答案:

答案 0 :(得分:1)

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

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

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

至于在后台运行,如果它没有运行,你应该通过检查nohup来知道。

答案 1 :(得分: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行。请注意exit后不需要exec。我把它留在那里以防你选择删除exec行。