V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
koebehshian
V2EX  ›  Linux

shell 脚本 sleep 1 秒都会卡住是什么原因

  •  
  •   koebehshian · 2018 年 1 月 24 日 · 6386 次点击
    这是一个创建于 2911 天前的主题,其中的信息可能已经有所发展或是发生改变。
    第 1 条附言  ·  2018 年 1 月 24 日
    已经发现是死循环了,与 sleep1 没关系。
    但死循环的原因还不清楚,条件是 while ! test -e /dev/ttyUSB0
    这个设备明明是存在的,代码复制出来运行可以的
    第 2 条附言  ·  2018 年 1 月 25 日
    已经找到原因是另一个地方的死循环 while test -e /dev/ttyUSB0,按理说我先重置掉 /dev/ttyUSB0 会没有,但不知道为什么变成存在的,导致了死循环。
    不管怎样,吸取的教训就是不能写死循环,设置一定的超时时间
    koebehshian
        1
    koebehshian  
    OP
       2018 年 1 月 24 日
    ikw
        2
    ikw  
       2018 年 1 月 24 日   ❤️ 1
    你试试 kill 了它,看是不是会变成 defunc...
    koebehshian
        3
    koebehshian  
    OP
       2018 年 1 月 24 日
    @zwpaper 你说 kill 哪个进程,sleep 1 的父进程爷进程都在的
    Beebird
        4
    Beebird  
       2018 年 1 月 24 日   ❤️ 1
    楼主的意思是 sleep 1 这个进程会长时间运行,无法结束?
    单看这一张截图,没有任何异常。
    koebehshian
        5
    koebehshian  
    OP
       2018 年 1 月 24 日
    @Beebird 是啊,sleep 1 这个进程,按理说 1 秒后就自杀了,为什么还在吗,我在 resetgpio25.sh 脚本中调用的,等它 sleep 完我还要重启应用服务,结果它这卡住了,导致我的服务都没启动
    shn7798
        6
    shn7798  
       2018 年 1 月 24 日
    可能是当前目录 IO busy 导致的, 试试(cd /; sleep 1)
    ikw
        7
    ikw  
       2018 年 1 月 24 日
    @koebehshian #3 #3 kill sleep 1 这个,14527
    pkookp8
        8
    pkookp8  
       2018 年 1 月 24 日 via Android   ❤️ 1
    父进程和 sleep 的进程号差那么多,是不是死循环 sleep 了
    koebehshian
        9
    koebehshian  
    OP
       2018 年 1 月 24 日
    @pkookp8 没有啊,我复制出来前台运行可以的
    koebehshian
        10
    koebehshian  
    OP
       2018 年 1 月 24 日
    @shn7798 这和目录有什么关系,sleep 没有调用任何当前目录的资源
    Beebird
        11
    Beebird  
       2018 年 1 月 24 日
    把 sleep 1 注释掉试试看? @koebehshian
    koebehshian
        12
    koebehshian  
    OP
       2018 年 1 月 24 日
    @pkookp8 刚发现 sleep1 的进程 id 在变化,看来确实是死循环了,但不知道为什么死循环,代码我复制出来运行可以的,我的死循环是用 test -e 检测 /dev 目录下的设备。
    weyou
        13
    weyou  
       2018 年 1 月 24 日
    ! test -e /dev/ttyUSB0 是什么鬼?
    !是 test 的参数啊
    试试
    while test ! -e /dev/ttyUSB0
    Beebird
        14
    Beebird  
       2018 年 1 月 24 日
    是类似这样的吗?@koebehshian

    #!/bin/bash
    echo "starting"
    while [ ! -e /dev/ttyUSB0]; do
    echo "not exsiting"
    done
    sleep 1
    echo "finishing"

    执行的 shell 是 bash 还是其他 shell?
    koebehshian
        15
    koebehshian  
    OP
       2018 年 1 月 25 日
    @weyou 我试过两种都行
    koebehshian
        16
    koebehshian  
    OP
       2018 年 1 月 25 日
    @Beebird 不是,我 sleep1 会在循环里面,有两个循环,我先通过 gpio 把设备关了,然后一个死循环,等它没了;然后再开,再一个死循环等它出现。
    我原来以为是后面那个死循环,其实是前面那个死循环。
    语法问题就简单多了,我手动运行过没语法问题.
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   3372 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 38ms · UTC 11:58 · PVG 19:58 · LAX 03:58 · JFK 06:58
    ♥ Do have faith in what you're doing.