我有一个需要很长时间才能运行的脚本,因为它必须处理数千个文件。我想让这个脚本尽可能简单。为此,我想检查用户是否使用nohup和'&'运行脚本。 E.x.
me@myHost:/home/me/bin $ nohup doAlotOfStuff.sh &
。我想100%确定脚本是用nohup和'&'运行的,因为如果脚本因为某种原因在中间死亡,那么它是一个非常痛苦的恢复过程。
如何检查脚本本身内的两个关键参数?如果它们丢失了,如何在脚本变得更远之前停止脚本,并向用户抱怨他们运行脚本错误?更好的是,我有没有办法强制脚本在nohup&?
中运行编辑:服务器环境是AIX 7.1
答案 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
行。