最后遇到一个怪事,直接在命令行中启动某个程序是可以的,把这句命令写到脚本里,再执行脚本就失败了。
这句命令是启动一个占 64%内存的 python 程序(嵌入式环境,内存一共才 64 兆),这个脚本是看门狗,检测到挂了后就重启它。从内存来看,确实比较紧张,只看可用内存是不够的,加上缓存可能够了。
现在我把脚本里的命令改成 sh -c 'xxxxx' 就启动成功了。
是直接在脚本里执行权限低吗,为什么开 shell 执行就成功了
命令直接写到脚本里是不能执行还是执行失败?加 sh -c 就执行了,感觉是没有 x 权限
应该有的,我用 top 命令看着它起来,又挂掉,看起来像是内存不够。
有问题,贴日志,靠猜没意思
默认 shell 不是 sh ?占用内存比 sh 多?
引号问题?
检查系统日志和你的程序的错误打印, 尝试用 strace 之类跑一下.
如果这么简单我不会发帖了。感觉是内存不够的问题,因为我用 top 命令看着它起来又挂掉。奇怪的是,用 sh -c 'xxxx'就能申请到内存
这与什么 shell 没关系,我就是 python xxx.py 2> /dev/null > /dev/null &这样启动的,就失败了,不是马上挂掉,是启动到一半内存不够挂掉。改成 sh -c 'python xxx.py 2> /dev/null > /dev/null &'这样就能成功
不是说一次没成功过,所以程序没有问题,就是内存申请不到挂的,就是用 shell 来执行可以申请到内存
python xxx.py 2> /dev/null > /dev/null & 出错重定向到 /dev/null 也不是这种写法吧。。
可以尝试把脚本注掉 里面就只执行一个加了 sleep 的循环打印 这种几乎不怎么吃内存 看打印正常吧
如果正常 说明程序执行环节没问题 是内存太少导致的
内存确实少了,正常启动一般需要 64%的内存,而我启动前看了下只剩 50%的可用内存了,但加上 buffer,cached 之类的估计够了,问题是:直接 python xxx.py 2> /dev/null > /dev/null &这样启动,启动到一半内存不够挂掉。改成 sh -c 'python xxx.py 2> /dev/null > /dev/null &'这样就能成功。
dmesg 里看有没有 ooo
内存一共才 64M。有没有配置 swap ?
检查一下 kernel log,看看有没有 oom kill。
另外测试的时候不要重定向 stdout stderr,不然你都看不到出错信息。
sh 启动方式只会比直接启动更费内存,不可能更节省。除非 sh 启动时根本就没启动真正的 python 应用,比如 path 或者参数设置有问题之类的。
外存比内存还小,而且据说读写次数有限。有没有配置 swap 我没注意到。
由于外存小,日志好像都放在 tmp 里面。
在前台运行过,没有出错,后台运行才重定的。
肯定启动了,我用 top,ps 命令看过,而且进程 id 也一直不变,说明没重启