红联Linux门户
Linux帮助

linux下nohup调用函数

发布时间:2016-02-23 11:13:42来源:linux网站作者:haoyyy

写了一个shell脚本,想每次都用nohup调用,但是又不想每次都得敲.网上搜了下,nohup只能以脚本为参数,但又不想写两个分开的脚本.下面是搜到的一种能将nohup集成到一个脚本的方法:

function1(){ 
while true  
do 
echo "function1" 
sleep 1 
done  

echo "$@" | grep -q -- "--nohup" && function1 || echo "$@" | grep -q -- "--nohup" || nohup $0 "$@" --nohup & 


大体学习了一下最后一句话的意思(假如我们将脚本保存为test.sh):

我们先将最后一句话按照&&和||切分为4段:   ①&&②||③||④

第一段和第三段相同,用来判断参数中是否有--nohup,如果有返回为真,如果没,返回为假:

echo "$@" | grep -q -- "--nohup" 

第二段是我们要执行的方法function1:

第四段是:

nohup $0 "$@" --nohup & 

我们用sh test.sh执行这个shell,当执行到最后一句话的第一段,因为参数中没有--nohup,结果为假,第二段不被执行.然后执行第三段,结果一样为假,最后执行第四段.
我们将第四段的$0和"$@"替换后,就相当于执行:

nohup test.sh --nohup & 

现在相当于用nohup重新执行test.sh,并添加了--nohup参数.

这次在执行到第一段的时候结果为真,并继续执行function1函数.

至于为什么要加上第三段,是因为function1函数返回结果不一定为真.防止无限调用后面的nohup进入循环.


下面是一个平时使用的示例.里面包含了同一个目录下的同一个脚本不能同时运行两次的判断,放在这里用作笔记(感觉不应该写这么复杂的语句):

#!/bin/bash 
scriptName=test.sh 
sep=$'\005' 
timestamp=`date '+%Y%m%d%H%M%S'` 
yesterday=`date --date=yesterday '+%Y%m%d'` 
logTime=$(date +%Y%m%d_%H%M%S) 
logFile="test_${logTime}.log" 
dir=$(pwd) 

function test(){ 
echo test 

### only one process can run at the same time and the same directory ### 
function checkExists(){ 
PROCESS_COUNT=$(ps -ef |grep ${scriptName}| grep "${dir}" | grep -v grep | awk '{print $2}'|wc -l) 
if [ $PROCESS_COUNT -gt 0 ]; 
then 
echo "PROCESS_EXIST!!!" 
exit 0 
else 
return 2 
fi 

### start invoke ### 
echo "$@" | grep -q -- "--nohup" && test || echo "$@" | grep -q -- "--nohup" || checkExists || nohup $0 "$@" "${dir}" --nohup 1 0 > ${logFile} 2>&1 &


本文永久更新地址:http://www.linuxdiyf.com/linux/18318.html