最后遇到一个怪事,直接在命令行中启动某个程序是可以的,把这句命令写到脚本里,再执行脚本就失败了。
这句命令是启动一个占 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 之类跑一下.
|
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 也一直不变,说明没重启 |