看来()中的部分被执行了2次,也就是产生了2个子shell,因此,进程中会出现有3个同名进程的情况,而为了避免冲突,利用flock进行了异步操作,使处理()的处理能够依次进行,防止争用资源!!
2018-05-20 trAP EXIT#!/bin/bash #pid=$(jobs -p) #echo "pid is $(jobs -p)" d="+[%Y-%m-%d %H:%M:%S]" trap 'ki...
看来()中的部分被执行了2次,也就是产生了2个子shell,因此,进程中会出现有3个同名进程的情况,而为了避免冲突,利用flock进行了异步操作,使处理()的处理能够依次进行,防止争用资源!!
2018-05-20 trAP EXIT#!/bin/bash #pid=$(jobs -p) #echo "pid is $(jobs -p)" d="+[%Y-%m-%d %H:%M:%S]" trap 'ki...
1、单小括号 ()
①命令组。括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的部分使用。括号中多个命令之间用分号隔开,最后一个命令可以没有分号,各命令和括号之间不必有空格。
②命令替换。等同于`cmd`,shell扫描一遍命令行,发现了$(cmd)结构,便将$(cmd)中的cmd执行一次,得到其标准输出,再将此输出放到原来命令。有些shell不支持,如tcsh。
③用于初始化数组。如:array=(a b c d)
2018-05-20 trAP EXIT#!/bin/bash #pid=$(jobs -p) #echo "pid is $(jobs -p)" d="+[%Y-%m-%d %H:%M:%S]" trap 'ki...
如下代码在加锁过程中,flock -n 3里面的3是代表什么?如果是文件的FD的话,如何能确保不冲突?多谢。
#!/bin/bash
{
flock -n 3
[ $? -eq 1 ] && { echo fail; exit; }
echo $$
sleep 10
} 3<>mylockfile
flock的选项-n等同于--nonblock,表示非阻塞模式。man flock可以看到详细说明:
Fail (with an exit code of 1) rather than wait if the lock cannot be immediately acquired.
翻译过来就是,若不能立即获得文件锁,就直接出错返回1而不是继续等待(默认flock是会继续等待直到获得文件锁)。
3就是fd(即文件描述符)。
文件锁只是用于防止多个程序同时访问一个文件的冲突情况。
Shell自动分配fd的话,原本就不会使用已被占用的fd,而是自动递增。
这里显式指定fd为3(3<>mylockfile),是为了flock有操作的对象。只有unlock后文件才能被其他程序访问,这样就可以保证文件访问不冲突。
多谢。我想问的是,如果这个可以随意指定的话,那么万一有别人加锁时(对不同的文件)也用了这个fd(3),那么我再对另一个文件加锁也用了这个fd,这样会冲突吗?
追答
shell的FD通常为10个,即 0~9。
不同登录用户处于不同的shell环境,即使指定同样的fd,也是不冲突的。
就算在同一shell中,如果不是以source方式调用两个脚本,也还是会各自新建shell去执行的。
所以冲突的情况几乎不存在。
你自己可以实验下啊。比如:
test1.sh内容:
#!/bin/bash
{
flock -n 3
[ $? -eq 1 ] && { echo fail; exit; }
echo $$
sleep 2
./test2.sh
sleep 2
} 3<>mylockfile
test2.sh内容:
#!/bin/bash
{
flock -n 3
[ $? -eq 1 ] && { echo fail; exit; }
echo $$
} 3<>mylockfile
test1.sh中调用test2.sh
直接执行 test1.sh,test2.sh中flock会返回失败,导致test2.sh脚本直接退出而没有打印PID。
2018-05-20 trAP EXIT#!/bin/bash #pid=$(jobs -p) #echo "pid is $(jobs -p)" d="+[%Y-%m-%d %H:%M:%S]" trap 'ki...
重点说明
透过 flock ,程序会先尝试取得某个lock(通常代表某个档案)的拥有权之后才执行,执行的时候会握有该lock的拥有权,并且在结束之后才释出拥有权。
举例来说,如果我们写一个shell script放在 $HOME 底下:
?
1
2
3
#! /bin/bash
sleep 10
date
储存成 test.sh 并且打开执行权限( chmod 700 test.sh )
此时如果我们打开两个shell, 并且约同时执行:
?
1
flock /tmp/demo.lock ~/test.sh
这时会发生什麽事情呢?
使用者应该会看到两个shell都停住,一个等10秒后印出时间,一个再过10秒后印出时间:
A
?
1
wush@router:~$ flock /tmp/demo.lock ./test.sh
B
?
1
wush@router:~$ flock /tmp/demo.lock ./test.sh
其中A程序先抢到 /tmp/demo.lock 的拥有权,然后执行 test.sh 。而B程序等到A程序结束之后(A归还 /tmp/demo.lock 的拥有权),才拿到 /tmp/demo.lock 的拥有权。所以B程序自然比A程序慢10秒。
2018-05-20 trAP EXIT#!/bin/bash #pid=$(jobs -p) #echo "pid is $(jobs -p)" d="+[%Y-%m-%d %H:%M:%S]" trap 'ki...
1.flock -n lock_path xxx :当无法获得拥有权的时候,直接中止程序,不执行xxx。
2018-05-20 trAP EXIT#!/bin/bash #pid=$(jobs -p) #echo "pid is $(jobs -p)" d="+[%Y-%m-%d %H:%M:%S]" trap 'ki...
linux中有三种标准输入输出,分别是 STDIN,STDOUT,STDERR,对应的数字是 0,1,2。
STDIN 是标准输入,默认从键盘读取信息;
STDOUT 是标准输出,默认将输出结果输出至终端,也就是显示器之类的东西;
STDERR 是标准的错误信息,默认也会显示在终端上。
由于STDOUT与STDERR都会默认显示在终端上,为了区分二者的信息,就有了编号的0,1,2的定义,用1表示STDOUT,2表示STDERR。
2018-05-20 trAP EXIT#!/bin/bash #pid=$(jobs -p) #echo "pid is $(jobs -p)" d="+[%Y-%m-%d %H:%M:%S]" trap 'ki...
格式:trap "commands" EXIT
脚本退出时执行commands指定的命令。(If a sigspec is EXIT (0) the command arg is executed on exit from the shell.)
2018-05-20 trAP EXIT#!/bin/bash #pid=$(jobs -p) #echo "pid is $(jobs -p)" d="+[%Y-%m-%d %H:%M:%S]" trap 'ki...
#!/bin/bash #pid=$(jobs -p) #echo "pid is $(jobs -p)" d="+[%Y-%m-%d %H:%M:%S]" trap 'ki...
Install Chinese Language support # First install the Chinese language desktop environme...
February 29, 2016Xiao Guo-An 0 Comment Desktop Linux In this tutorial, I will show you ...