linux下nohup调用函数

本文介绍如何在Shell脚本中集成nohup命令,实现根据参数选择后台运行脚本的功能,并附带一个示例脚本,展示了如何确保同一目录下同一脚本不会同时运行多个实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写了一个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进入循环.


参考资料:

http://stackoverflow.com/questions/16435629/linux-shell-script-call-a-function-by-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 &  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值