240 发简信
IP属地:北京
  • 看来()中的部分被执行了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...

  • 2018-05-20 trAP EXIT

    #!/bin/bash #pid=$(jobs -p) #echo "pid is $(jobs -p)" d="+[%Y-%m-%d %H:%M:%S]" trap 'ki...

  • Install Chinese Language support in Linux Mint Debian

    Install Chinese Language support # First install the Chinese language desktop environme...

  • Install Chinese Fcitx Wbpy Input Method on Debian 8 Gnome Desktop

    February 29, 2016Xiao Guo-An 0 Comment Desktop Linux In this tutorial, I will show you ...