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

[怪事] 直接在执行命令可以,写到脚本里就失败

  •  
  •   koebehshian · 2017-07-29 09:00:23 +08:00 · 3415 次点击
    这是一个创建于 2434 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最后遇到一个怪事,直接在命令行中启动某个程序是可以的,把这句命令写到脚本里,再执行脚本就失败了。

    这句命令是启动一个占 64%内存的 python 程序(嵌入式环境,内存一共才 64 兆),这个脚本是看门狗,检测到挂了后就重启它。从内存来看,确实比较紧张,只看可用内存是不够的,加上缓存可能够了。

    现在我把脚本里的命令改成 sh -c 'xxxxx' 就启动成功了。

    是直接在脚本里执行权限低吗,为什么开 shell 执行就成功了

    14 条回复    2017-07-31 08:21:12 +08:00
    kiwi95
        1
    kiwi95  
       2017-07-29 09:07:35 +08:00
    命令直接写到脚本里是不能执行还是执行失败?加 sh -c 就执行了,感觉是没有 x 权限
    koebehshian
        2
    koebehshian  
    OP
       2017-07-29 09:12:24 +08:00
    @kiwi95 应该有的,我用 top 命令看着它起来,又挂掉,看起来像是内存不够。
    wweir
        3
    wweir  
       2017-07-29 09:15:00 +08:00 via Android
    有问题,贴日志,靠猜没意思
    choury
        4
    choury  
       2017-07-29 09:21:12 +08:00 via Android
    默认 shell 不是 sh ?占用内存比 sh 多?
    widewing
        5
    widewing  
       2017-07-29 09:49:32 +08:00 via Android
    引号问题?
    eyp82
        6
    eyp82  
       2017-07-29 10:02:05 +08:00
    检查系统日志和你的程序的错误打印, 尝试用 strace 之类跑一下.
    koebehshian
        7
    koebehshian  
    OP
       2017-07-29 10:21:11 +08:00
    @widewing 如果这么简单我不会发帖了。感觉是内存不够的问题,因为我用 top 命令看着它起来又挂掉。奇怪的是,用 sh -c 'xxxx'就能申请到内存
    koebehshian
        8
    koebehshian  
    OP
       2017-07-29 10:23:31 +08:00
    @choury 这与什么 shell 没关系,我就是 python xxx.py 2> /dev/null > /dev/null &这样启动的,就失败了,不是马上挂掉,是启动到一半内存不够挂掉。改成 sh -c 'python xxx.py 2> /dev/null > /dev/null &'这样就能成功
    koebehshian
        9
    koebehshian  
    OP
       2017-07-29 10:25:24 +08:00
    @eyp82 不是说一次没成功过,所以程序没有问题,就是内存申请不到挂的,就是用 shell 来执行可以申请到内存
    fxxkgw
        10
    fxxkgw  
       2017-07-29 11:32:05 +08:00
    python xxx.py 2> /dev/null > /dev/null & 出错重定向到 /dev/null 也不是这种写法吧。。
    可以尝试把脚本注掉 里面就只执行一个加了 sleep 的循环打印 这种几乎不怎么吃内存 看打印正常吧
    如果正常 说明程序执行环节没问题 是内存太少导致的
    koebehshian
        11
    koebehshian  
    OP
       2017-07-29 11:54:48 +08:00
    @fxxkgw 内存确实少了,正常启动一般需要 64%的内存,而我启动前看了下只剩 50%的可用内存了,但加上 buffer,cached 之类的估计够了,问题是:直接 python xxx.py 2> /dev/null > /dev/null &这样启动,启动到一半内存不够挂掉。改成 sh -c 'python xxx.py 2> /dev/null > /dev/null &'这样就能成功。
    firefox12
        12
    firefox12  
       2017-07-29 14:25:34 +08:00 via iPhone
    dmesg 里看有没有 ooo
    sylecn
        13
    sylecn  
       2017-07-30 10:28:00 +08:00 via Android
    内存一共才 64M。有没有配置 swap ?
    检查一下 kernel log,看看有没有 oom kill。
    另外测试的时候不要重定向 stdout stderr,不然你都看不到出错信息。

    sh 启动方式只会比直接启动更费内存,不可能更节省。除非 sh 启动时根本就没启动真正的 python 应用,比如 path 或者参数设置有问题之类的。
    koebehshian
        14
    koebehshian  
    OP
       2017-07-31 08:21:12 +08:00
    @sylecn 外存比内存还小,而且据说读写次数有限。有没有配置 swap 我没注意到。
    由于外存小,日志好像都放在 tmp 里面。
    在前台运行过,没有出错,后台运行才重定的。

    肯定启动了,我用 top,ps 命令看过,而且进程 id 也一直不变,说明没重启
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3245 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 13:10 · PVG 21:10 · LAX 06:10 · JFK 09:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.