写了一个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 &