2016-02-04 58 views
0

我得到了一个需要很长时间才能运行的脚本,因为它必须处理成千上万的文件。我想尽可能使这个脚本尽可能的简单。为此,我想检查用户是否使用nohup和'&'来运行脚本。 E.x. [email protected]:/home/me/bin $ nohup doAlotOfStuff.sh &。我想100%确定脚本是用nohup和'&'运行的,因为如果脚本因为任何原因死在中间,那么它的恢复过程非常痛苦。如何判断一个脚本是否在后台运行并使用nohup?

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

编辑:服务器enviornment是AIX 7.1

+0

请问为什么不使用'screen'或'tmux'? –

+1

它们基本上是终端复用器。他们让您在远程计算机(或本地计算机)中打开分离的会话。我强烈建议使用其中之一。 “屏幕”更简单,而“tmux”的功率更大。 –

+0

嘿,我不小心删除了我以前的评论。这些命令在AIX中不起作用,这是我的服务器环境。另外,我觉得这不是解决问题的根本原因。我想这样做,即使最愚蠢的用户不能混淆脚本= = – R4F6

回答

1

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

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

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

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

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

如果您更喜欢救助并警告用户,您可以删除exec线。请注意,在exec后不需要。我留在那里以防万一您选择删除exec行。

+0

您认为哪两种方式最为可取? – R4F6

+0

如果不希望用户运行输出重定向到'/ dev/null'或其他文件为'doAlotOfStuff.sh>/dev/null 2>&1'的命令,并且不知道它实际上是保留的直到第二天当他们检查重定向输出时,最好在后台自动重启。 – alvits

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来运行,并且可以通过在临时广播文件上使用挂接命令来对它们进行斥责。 (如果你想让我详细说明我可以)。

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

相关问题