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

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

  •  
  •   koebehshian · 2018-01-24 10:41:15 +08:00 · 5854 次点击
    这是一个创建于 2255 天前的主题,其中的信息可能已经有所发展或是发生改变。
    第 1 条附言  ·  2018-01-24 13:11:01 +08:00
    已经发现是死循环了,与 sleep1 没关系。
    但死循环的原因还不清楚,条件是 while ! test -e /dev/ttyUSB0
    这个设备明明是存在的,代码复制出来运行可以的
    第 2 条附言  ·  2018-01-25 09:07:48 +08:00
    已经找到原因是另一个地方的死循环 while test -e /dev/ttyUSB0,按理说我先重置掉 /dev/ttyUSB0 会没有,但不知道为什么变成存在的,导致了死循环。
    不管怎样,吸取的教训就是不能写死循环,设置一定的超时时间
    koebehshian
        1
    koebehshian  
    OP
       2018-01-24 10:44:24 +08:00
    zwpaper
        2
    zwpaper  
       2018-01-24 11:14:47 +08:00   ❤️ 1
    你试试 kill 了它,看是不是会变成 defunc...
    koebehshian
        3
    koebehshian  
    OP
       2018-01-24 11:24:42 +08:00
    @zwpaper 你说 kill 哪个进程,sleep 1 的父进程爷进程都在的
    Beebird
        4
    Beebird  
       2018-01-24 11:28:10 +08:00   ❤️ 1
    楼主的意思是 sleep 1 这个进程会长时间运行,无法结束?
    单看这一张截图,没有任何异常。
    koebehshian
        5
    koebehshian  
    OP
       2018-01-24 11:34:12 +08:00
    @Beebird 是啊,sleep 1 这个进程,按理说 1 秒后就自杀了,为什么还在吗,我在 resetgpio25.sh 脚本中调用的,等它 sleep 完我还要重启应用服务,结果它这卡住了,导致我的服务都没启动
    shn7798
        6
    shn7798  
       2018-01-24 11:50:08 +08:00
    可能是当前目录 IO busy 导致的, 试试(cd /; sleep 1)
    zwpaper
        7
    zwpaper  
       2018-01-24 11:54:09 +08:00
    @koebehshian #3 #3 kill sleep 1 这个,14527
    pkookp8
        8
    pkookp8  
       2018-01-24 11:54:21 +08:00 via Android   ❤️ 1
    父进程和 sleep 的进程号差那么多,是不是死循环 sleep 了
    koebehshian
        9
    koebehshian  
    OP
       2018-01-24 12:10:57 +08:00
    @pkookp8 没有啊,我复制出来前台运行可以的
    koebehshian
        10
    koebehshian  
    OP
       2018-01-24 12:12:42 +08:00
    @shn7798 这和目录有什么关系,sleep 没有调用任何当前目录的资源
    Beebird
        11
    Beebird  
       2018-01-24 13:00:29 +08:00
    把 sleep 1 注释掉试试看? @koebehshian
    koebehshian
        12
    koebehshian  
    OP
       2018-01-24 13:07:37 +08:00
    @pkookp8 刚发现 sleep1 的进程 id 在变化,看来确实是死循环了,但不知道为什么死循环,代码我复制出来运行可以的,我的死循环是用 test -e 检测 /dev 目录下的设备。
    weyou
        13
    weyou  
       2018-01-24 15:08:55 +08:00
    ! test -e /dev/ttyUSB0 是什么鬼?
    !是 test 的参数啊
    试试
    while test ! -e /dev/ttyUSB0
    Beebird
        14
    Beebird  
       2018-01-24 16:32:30 +08:00
    是类似这样的吗?@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-01-25 09:08:09 +08:00
    @weyou 我试过两种都行
    koebehshian
        16
    koebehshian  
    OP
       2018-01-25 09:14:21 +08:00
    @Beebird 不是,我 sleep1 会在循环里面,有两个循环,我先通过 gpio 把设备关了,然后一个死循环,等它没了;然后再开,再一个死循环等它出现。
    我原来以为是后面那个死循环,其实是前面那个死循环。
    语法问题就简单多了,我手动运行过没语法问题.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3118 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 12:58 · PVG 20:58 · LAX 05:58 · JFK 08:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.