24号相关笔记
默认情况下bash会忽略SIGQUIT和SIGTERM信号,但是会处理SIGINT和SIGHUP信号
nohup会运行一个命令来阻断所有发送给该进程的SIGHUP信号这会在终端退出时阻止进程退出,从而接触进程与终端之间的关联。
oracle@linux:~/zy> nohup ./testsignal.sh &
[1] 8862
oracle@linux:~/zy> nohup: ignoring input and appending output to “nohup.out”
由于进程终端和进程之间的关联被解除了,那么原来与stdout和stderr文件描述描述符关联的终端输出也被解除了,nohup将会将对应的stdout和stderr重定向到nohup.out文件,将原来要输出到终端的信息输出到nohup.out文件中。当然也可以通过重定向将对应的数据输出到你所指定的文件中。
#!/bin/bash
exec 3>&1
exec 1>testout
trap "echo byebye" EXIT
count=1
while [ $count -le 5 ]
do
echo "Loop #$count"
sleep 1
count=$[ $count + 1 ]
done
trap - EXIT
echo "I have removed trap"
exec 1>&-
exec 1>3
这里重定向将stdout描述符重定向到testout,将原来的标准输出输出到了testout文件中文件的数据结果如下:
oracle@linux:~/zy> cat testout
Loop #1
Loop #2
Loop #3
Loop #4
Loop #5
I have removed trap
调度优先级是指内核分配给该进程的相对于分配给其他进程的CPU的时间总量
nice修改可以修改对应进程的优先级但是他只能降低优先级不能增加用户的优先级。
函数的定义
function name(){
command
return var
}
Shell中函数定义可以定在shell脚本中的任何一个位置但是必须在使用这个函数之前同时不允许函数重载。
Shell中函数的返回可以使用return命令如果没有return命令将函数体中command的执行状态。其实二者都可以看成返回的是function函数的执行状态,通过$?获取返回的值。Linux会将定义的函数当成一个可执行的shell脚本来对这也正是返回的都是状态值所以返回值的大小均不会超过0-255,且函数一结束就应该取回值否则将被其他命令的执行状态值所覆盖。
total=0
num1=1
num2=355
function func1(){
total=$[ $num1 + $num2 ]
value=259
return $value
}
value=`func1`
echo "out function total=$total,value=$value,\$? is $?"
输出结果:
out function total=0,value=,$? is 3。
可以看出shell中函数调用并不像其他语言一样将函数的return的值赋值到了value中,而是保存在了$?中且对对应的值进行了256的取模运算。
如果要获取大于255的值可以使用echo:
#!/bin/bash
total=0
num1=1
num2=355
function func1(){
total=$[ $num1 + $num2 ]
echo $total
value=259
return $value
}
value=`func1`
echo "out function total=$total,value=$value,\$? is $?"
其输出结果为:
out function total=0,value=356,$? is 3
函数中使用参数
在shell脚本中会将你定义的一个函数当成一个可执行脚本来对待所以在调用函数时可以使用标准的参数环境变量来传递参数。
function addem(){
if [ $# -eq 0 ]||[ $# -gt 2 ]
then
echo -1
elif [ $# -eq 1 ]
then
echo $[ $1 + $1 ]
else
echo $[ $1 + $2 ]
fi
}
echo -n "Adding 10 and 15:"
value=`addem 10 15`
echo $value
echo -n "Let's try adding just one number:"
value=`addem 10`
echo $value
echo -n "Now trying add no numbers:"
value=`addem`
echo $value
echo -n "Finally add three parameter:"
value=`addem 10 11 12`
echo $value
但是不能使用这中方式从终端直接传递参数给函数:
function badfun(){
echo $[ $1 * $2 ]
}
if [ $# -eq 2 ]
then
value=`badfun`
echo "The result is $value"
else
echo "Usage:badtest1 a b"
fi
这样通过终端传递参数个函数是不正确的。
局部函数变量提供了自成体系的特性,自成体系的函数不需要使用任何外部资源,除了命令行传递给它的参数变量。这使得函数可以递归地调用。
浙公网安备 33010602011771号