明陞国际
国际娱乐平台官网
Portraits
Journal
Contact
-n参数可以让flock命令以非阻塞方式探测一个文件是否已经被加锁,所以可以使用互斥锁的特点保证脚本运行的唯一性。脚本退出的时候锁会被释放,所以这里可以不用显式的使用flock解锁。flock除了-u参数指定文件描述符锁文件以外,还可以作为执行命令的前缀使用。这种方式非常适合直接在crond中方式所要执行的脚本重复执行。如:
*/1 * * * * /usr/bin/flock -xn /tmp/script.lock -c '/home/bash/script.sh'关于flock的其它参数,可以man flock找到说明。
受限bash以受限模式执行bash程序,有时候是很有必要的。这种模式可以保护我们的很多系统环境不受bash程序的误操作影响。启动受限模式的bash的方法是使用-r参数,或者也可以rbash的进程名方式执行bash。受限模式的bash和正常bash时间的差别是:
不能使用cd命令改变当前工作目录。
不能改变SHELL、PATH、ENV和BASH_ENV环境变量。
不能调用含有/的命令路径。
不能使用.执行带有/字符的命令路径。
不能使用hash命令的-p参数指定一个带斜杠\的参数。
不能在shell环境启动的时候加载函数的定义。
不能检查SHELLOPTS变量的内容。
不能使用>, >|, <>, >&, &>和 >>重定向操作符。
不能使用exec命令使用一个新程序替换当前执行的bash进程。
enable内建命令不能使用-f、-d参数。
不可以使用enable命令打开或者关闭内建命令。
command命令不可以使用-p参数。
不能使用set +r或者set +o restricted命令关闭受限模式。
测试一个简单的受限模式:
[zorro@zorrozou-pc0 bash]$ cat restricted.sh #!/bin/bash set -r cd /tmp [zorro@zorrozou-pc0 bash]$ ./restricted.sh ./restricted.sh: line 5: cd: restrictedsubshell我们前面接触过subshell的概念,我们之前说的是,当一个命令放在()中的时候,bash会打开一个子进程去执行相关命令,这个子进程实际上是另一个bash环境,叫做subshell。当然包括放在()中执行的命令,bash会在以下情况下打开一个subshell执行命令:
使用&作为命令结束提交了作业控制任务时。
使用|连接的命令会在subshell中打开。
使用()封装的命令。
使用coproc(bash 4.0版本之后支持)作为前缀执行的命令。
要执行的文件不存在或者文件存在但不具备可执行权限的时候,这个执行过程会打开一个subshell执行。
在subshell中,有些事情需要注意。subshell中的$$取到的仍然是父进程bash的pid,如果想要取到subshell的pid,可以使用BASHPID变量:
[zorro@zorrozou-pc0 bash]$ echo $$ ;echo $BASHPID && (echo $$;echo $BASHPID) 5484 5484 5484 24584可以使用BASH_SUBSHELL变量的值来检查当前环境是不是在subshell中,这个值在非subshell中是0;每进入一层subshell就加1。
[zorro@zorrozou-pc0 bash]$ echo $BASH_SUBSHELL;(echo $BASH_SUBSHELL;(echo $BASH_SUBSHELL)) 0 1 2在subshell中做的任何操作都不会影响父进程的bash执行环境。subshell除了PID和trap相关设置外,其他的环境都跟父进程是一样的。subshell的trap设置跟父进程刚启动的时候还没做trap设置之前一样。
协进程coprocess在bash 4.0版本之后,为我们提供了一个coproc关键字可以支持协进程。协进程提供了一种可以上bash移步执行另一个进程的工作模式,实际上跟作业控制类似。严格来说,bash的协进程就是使用作业控制作为实现手段来做的。它跟作业控制的区别仅仅在于,协进程的标准输入和标准输出都在调用协进程的bash中可以取到文件描述符,而作业控制进程的标准输入和输出都是直接指向终端的。我们来看看使用协进程的语法:
coproc [NAME] command [redirections]使用coproc作为前缀,后面加执行的命令,可以将命令放到作业控制里执行。并且在bash中可以通过一些方法查看到协进程的pid和使用它的输入和输出。例子:
国际娱乐平台官网
Portraits
Journal
Contact