最后遇到一个怪事,直接在命令行中启动某个程序是可以的,把这句命令写到脚本里,再执行脚本就失败了。
这句命令是启动一个占 64%内存的 python 程序(嵌入式环境,内存一共才 64 兆),这个脚本是看门狗,检测到挂了后就重启它。从内存来看,确实比较紧张,只看可用内存是不够的,加上缓存可能够了。
现在我把脚本里的命令改成 sh -c 'xxxxx' 就启动成功了。
是直接在脚本里执行权限低吗,为什么开 shell 执行就成功了
![]() | 1 kiwi95 2017-07-29 09:07:35 +08:00 命令直接写到脚本里是不能执行还是执行失败?加 sh -c 就执行了,感觉是没有 x 权限 |
2 koebehshian OP @kiwi95 应该有的,我用 top 命令看着它起来,又挂掉,看起来像是内存不够。 |
![]() | 3 wweir 2017-07-29 09:15:00 +08:00 via Android 有问题,贴日志,靠猜没意思 |
![]() | 4 choury 2017-07-29 09:21:12 +08:00 via Android 默认 shell 不是 sh ?占用内存比 sh 多? |
5 widewing 2017-07-29 09:49:32 +08:00 via Android 引号问题? |
6 eyp82 2017-07-29 10:02:05 +08:00 检查系统日志和你的程序的错误打印, 尝试用 strace 之类跑一下. |
&nbp; 7 koebehshian OP @widewing 如果这么简单我不会发帖了。感觉是内存不够的问题,因为我用 top 命令看着它起来又挂掉。奇怪的是,用 sh -c 'xxxx'就能申请到内存 |
8 koebehshian OP |
9 koebehshian OP @eyp82 不是说一次没成功过,所以程序没有问题,就是内存申请不到挂的,就是用 shell 来执行可以申请到内存 |
![]() | 10 fxxkgw 2017-07-29 11:32:05 +08:00 python xxx.py 2> /dev/null > /dev/null & 出错重定向到 /dev/null 也不是这种写法吧。。 可以尝试把脚本注掉 里面就只执行一个加了 sleep 的循环打印 这种几乎不怎么吃内存 看打印正常吧 如果正常 说明程序执行环节没问题 是内存太少导致的 |
11 koebehshian OP |
12 firefox12 2017-07-29 14:25:34 +08:00 via iPhone dmesg 里看有没有 ooo |
13 sylecn 2017-07-30 10:28:00 +08:00 via Android 内存一共才 64M。有没有配置 swap ? 检查一下 kernel log,看看有没有 oom kill。 另外测试的时候不要重定向 stdout stderr,不然你都看不到出错信息。 sh 启动方式只会比直接启动更费内存,不可能更节省。除非 sh 启动时根本就没启动真正的 python 应用,比如 path 或者参数设置有问题之类的。 |
14 koebehshian OP @sylecn 外存比内存还小,而且据说读写次数有限。有没有配置 swap 我没注意到。 由于外存小,日志好像都放在 tmp 里面。 在前台运行过,没有出错,后台运行才重定的。 肯定启动了,我用 top,ps 命令看过,而且进程 id 也一直不变,说明没重启 |