erlang踩坑记录之os_mon

LiveReload:释放你的F5,实时预览HTML效果 一、liveReload插件开发背景Web前端开发人员在写页面时,如果修改了HTML or CSS,要想看效果通常的做法就是保存代码就得 Alt+Tab,切换到浏览器(当然,我知道很多开发人员是双屏操作不一定需要切换到浏览器),但是一定要F5刷新才能看自己刚写的代码有没有效果,没有效果就再切换到编辑器下修改,然后再切换到浏览器F5刷新看效果,还没有效果,就再继续修改,如此反复。时间久了,前端自动化... 阅读详情

1、现象

          最近为系统开发一个监控工具,最先想到的就是应用erlang自带的os_mon,非常实用,它可以监控每个进程内存使用比例等等信息,但是在实际开发过程中,遇到了不少麻烦。

2、分析过程

       启动os_mon,过程非常简单,代码如下:
application:start(os_mon).

       注意,os_mon依赖于sasl,如果没有启动sasl,先启动sasl。执行代码,发现代码执行失败了,错误信息如下:
(game4@192.168.1.130)5> os_mon:start([], []).
** exception exit: shutdown

=CRASH REPORT==== 1-Sep-2017::01:01:29 ===
  crasher:
    initial call: os_mon_sysinfo:init/1
    pid: <0.371.0>
    registered_name: []
    exception exit: {enoent,
                        [{erlang,open_port,
                             [{spawn,
                                  "d:/Program Files (x86)/erl5.9.1/lib/os_mon-2.2.9/priv/bin/win32sysinfo.exe"},
                              [{packet,1}]],
                             []},
                         {os_mon,open_port,2,[{file,"os_mon.erl"},{line,88}]},
                         {os_mon_sysinfo,start_portprogram,0,
                             [{file,"os_mon_sysinfo.erl"},{line,111}]},
                         {os_mon_sysinfo,init,1,
                             [{file,"os_mon_sysinfo.erl"},{line,60}]},
                         {gen_server,init_it,6,
                             [{file,"gen_server.erl"},{line,304}]},
                         {proc_lib,init_p_do_apply,3,
                             [{file,"proc_lib.erl"},{line,227}]}]}
      in function  gen_server:init_it/6 (gen_server.erl, line 328)
    ancestors: [os_mon_sup,<0.51.0>]
    messages: []
    links: [<0.370.0>]
    dictionary: []
    trap_exit: true
    status: running
    heap_size: 987
    stack_size: 24
    reductions: 550
  neighbours:
(game4@192.168.1.130)6> 

 很长一串错误,看错误位置,应该是erlang执行外部程序win32sysinfo.exe时报错,很奇怪的错误,从头开始追踪,首先是os_mon.erl
init([]) ->
    SupFlags = case os:type() of
		   {win32, _} ->
		       {one_for_one, 5, 3600};
		   _ ->
		       {one_for_one, 4, 3600}
	       end,
    SysInf = childspec(sysinfo, startp(sysinfo)),
    DskSup = childspec(disksup, startp(disksup)),
    MemSup = childspec(memsup,  startp(memsup)),
    CpuSup = childspec(cpu_sup, startp(cpu_sup)),
    OsSup  = childspec(os_sup,  startp(os_sup)),
    {ok, {SupFlags, SysInf ++ DskSup ++ MemSup ++ CpuSup ++ OsSup}}.

childspec(_Service, false) ->
    [];
childspec(cpu_sup, true) ->
    [{cpu_sup, {cpu_sup, start_link, []},
      permanent, 2000, worker, [cpu_sup]}];
childspec(disksup, true) ->
    [{disksup, {disksup, start_link, []},
      permanent, 2000, worker, [disksup]}];
childspec(memsup, true) ->
    [{memsup, {memsup, start_link, []},
      permanent, 2000, worker, [memsup]}];
childspec(os_sup, true) ->
    OS = os:type(),
    Mod = case OS of
	      {win32, _} -> nteventlog; % windows
	      _ -> os_sup % solaris
	  end,
    [{os_sup, {os_sup, start_link, [OS]},
      permanent, 10000, worker, [Mod]}];
childspec(sysinfo, true) ->
    [{os_mon_sysinfo, {os_mon_sysinfo, start_link, []},
      permanent, 2000, worker, [os_mon_sysinfo]}].

从以上代码可以看出来,os_mon启动在init/1的时候,检查disk_sup,mem_sup,cpu_sup,os_sup等是否满足启动条件,满足则启动,从前面的报错信息中可以看出来,应该在sysinfo这里报错了,所以,继续追查sysinfo,代码模块是os_mon_sysinfo.erl如下:
init([]) ->
    process_flag(trap_exit, true),
    process_flag(priority, low),
    Port = case os:type() of
	       {win32, _OSname} -> start_portprogram();
	       OS -> exit({unsupported_os, OS})
	   end,
    {ok, #state{port=Port}}.


start_portprogram() ->
    Port = os_mon:open_port("win32sysinfo.exe", [{packet,1}]),
    receive
	{Port, {data, [?OK]}} ->
	    Port;
	{Port, {data, Data}} ->
	    exit({port_error, Data});
	{'EXIT', Port, Reason} ->
	    exit({port_died, Reason})
    after 5000 ->
	    exit({port_error, timeout})
    end.

从上面的代码中可以看出,显然的sysinfo启动的时候,启动port命令os_mon:open_port("win32sysinfo.exe", [{packet,1}]),那问题应该就在open_port的这部分代码,如下:
open_port(Name, Opts) ->
    PrivDir = code:priv_dir(os_mon),
    ReleasedPath = filename:join([PrivDir,"bin",Name]),
    %% Check os_mon*/priv/bin/Name
    case filelib:is_regular(ReleasedPath) of
	true ->
	    erlang:open_port({spawn, ReleasedPath}, Opts);
	false ->
	    %% Use os_mon*/priv/bin/Arch/Name
	    ArchPath =
		filename:join(
		  [PrivDir,"bin",erlang:system_info(system_architecture),Name]),
	    erlang:open_port({spawn, ArchPath}, Opts)
    end.

很显然,当需要启动sysinfo的时候,erlang会根据os_mon的路径(代码 code:priv_dir(os_mon)),也就是erlang的安装路径,查找并执行win32sysinfo.exe,但是如果erlang安装路径中存在空格,那么这个执行的命令就会被操作系统分割成命令+参数的形式,而这种形式肯定是不可能执行成功的。erlang:open_port/2文档描述如下:
{spawn, Command}

Starts an external program. Command is the name of the external program which will be run.Command runs outside the Erlang work space unless an Erlang driver with the nameCommand is found. If found, that driver will be started. A driver runs in the Erlang workspace, which means that it is linked with the Erlang runtime system.

When starting external programs on Solaris, the system call vfork is used in preference to fork for performance reasons, although it has a history of being less robust. If there are problems with usingvfork, setting the environment variable ERL_NO_VFORK to any value will cause fork to be used instead.

For external programs, the PATH is searched (or an equivalent method is used to find programs, depending on operating system). This is done by invoking the shell on certain platforms. The first space separated token of the command will be considered as the name of the executable (or driver). This (among other things) makes this option unsuitable for running programs having spaces in file or directory names. Use {spawn_executable, Command} instead if spaces in executable file names is desired.

3、解决办法

       分析了问题是怎么产生的,解决办法也就有了,按照文档描述,可以使用{spawn_executable, Command}的方式替代,如果不想修改erlang的源码,那么就换安装路径吧。

4、总结

      很早之前就听说过编程工具安装不要在有空格有中文路径下,一开始不是很理解,果然实践出真理。
SAP Fiori Elements 扩展实战:UI 层扩展、OData 服务扩展、CDS 视图增强及全流程案例 UI 层扩展主要关注在不修改标准生成界面的基础上,自定义用户界面元素和交互逻辑。典型需求包括:在现有 Fiori Elements 界面上添加新的字段(如表格列或表单项)、增加自定义按钮并绑定操作、以及通过控制器扩展加入事件处理等。无论在 RAP 还是传统 BOPF 架构下,前端 UI 扩展通常采用 SAPUI5 提供的**扩展点(Extension Points)和控制器扩展(Controller Extension)**机制来安全地插入自定义代码。下面分别说明两种后端架构下 UI 扩展的实现方式。 阅读详情

相关推荐

CARLA 0.9.15从零开始:环境搭建与基础场景实战指南

本文是CARLA 0.9.15从零开始的完整环境搭建与基础运行教程。详细介绍了在Linux系统下配置Python环境、下载安装CARLA核心软件包、启动服务器以及运行第一个基础场景的步骤。重点演示了如何通过Python客户端脚本生成随机车流,并手动控制EGO车辆在仿真城市中行驶,为自动驾驶算法开发构建了坚实的仿真测试基础。

weixin_29053383的博客 777

erlang错误处理

https://www.cnblogs.com/zhongwencool/p/error_exit_throw.html

牛逼! 532

AMD 3D V-Cache技术解析:CPU缓存堆叠如何突破性能瓶颈

在半导体领域,缓存(Cache)是提升处理器性能的关键技术,其核心原理是在高速CPU核心与慢速主存之间建立数据中转站,以缓解“内存墙”问题。随着摩尔定律放缓,传统平面扩展缓存面临面积成本高、延迟增加等挑战。3D封装技术应运而生,通过垂直堆叠实现极致的互联密度与带宽,成为突破性能瓶颈的重要工程路径。这项技术的价值在于能以更优的功耗和延迟,显著提升缓存容量,从而改善游戏、科学计算等数据密集型应用的性能。以AMD 3D V-Cache为代表的Hybrid Bonding(混合键合)工艺,正是这一趋势的典型实践,它

weixin_30432579的博客 417

Tsung笔记之插件编写篇

前言 Tsung对具体协议、通道的支持,一般以插件形式提供接口,接口不是很复杂,插件也很容易编写,支持协议多,也就不足为怪了。 下面首先梳理一下当前Tsung 1.6.0所有内置插件,然后为一个名称为Qmsg的私有二进制协议编写插件, 运行Qmsg服务器端程序,执行压力测试,最后查看测试报告。 已支持插件梳理 Tsung 1.6.0支持的协议很多,简单梳理一下: 

Lee的博客 1831

ComfyUI安装包运行前准备:安装Git

Git 是一个分布式版本控制系统(Version Control System, VCS),用于跟踪和管理文件(尤其是代码)的变更历史。 简单理解就是,git是用来管理文件的版本的,如果有新的版本,就可以使用git来更新。

聚梦小课堂 2万+

告别Modern Standby烦恼:在Windows 11中手动启用S3睡眠模式的完整指南

本文详细介绍了如何在Windows 11中手动启用S3睡眠模式,解决Modern Standby(S0模式)导致的笔记本睡眠后耗电问题。通过注册表修改、电源选项调整、BIOS设置等步骤,帮助用户恢复传统深度睡眠功能,显著提升电池续航表现。

weixin_30271335的博客 559

rabbitMq启动出错

rabbitMq启动出错 Job for rabbitmq-server.service failed because the control process exited with error code. See “systemctl status rabbitmq-server.service” and “journalctl -xe” for details. ● rabbitmq-serv...

Lailai Monkey的博客 2万+

微信商家转账报错“当前使用用户过多,请稍后重新确认收款”解决方案

当前使用用户过多,请稍后重新确认收款”这个错误,其实就是典型的参数误处理导致的假报错。记住一句话就行👇JSAPI 场景下的package参数不要做 UrlEncode。如果你也遇到这个问题,希望这篇文章能帮你少踩一个坑。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 784

Windows10下 安装使用RabbitMQ遇到的特别报错以及各种试错解决方案

 软件环境Windows10家庭版Erlang版本24.0 RabbitMQServer 3.8.19 安装方式网上随意可以搜到比如: https://blog.youkuaiyun.com/weixin_43876186/article/details/108344733 总体步骤为:安装Erlang 配置Erlang系统环境变量并添加到path中验证是否安装成功cm...

Set sail again 2031

管好 SAP Fiori Launchpad Content:技术目录、业务目录与 KPI 工具的完整治理思路

SAP Fiori Launchpad 作为企业级统一入口,需通过技术目录(源对象)和业务目录(引用编排)分层治理。技术目录由 Launchpad App Manager 维护,负责应用描述对象(Tile 和 Target Mapping)的创建与管理;业务目录由 Launchpad Content Manager 编排,通过引用技术目录对象实现灵活配置。分析型内容则通过 F2814 统一管理。这种分层设计支持应用复用,便于升级维护,是 SAP S/4HANA 项目中实现高效内容治理的关键。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 132

【QT/C++】事件过滤器之基于重写 eventFilter 方法的多种常见应用场景及实现

Qt事件过滤器通过重写eventFilter方法实现多种实用功能:1)鼠标事件处理(点击全选文本、禁用滚轮、悬停提示);2)键盘事件处理(输入内容限制、快捷键提交);3)焦点事件处理(自动弹出下拉框、实时验证);4)绘图事件处理(自定义控件绘制);5)窗口事件处理(防止意外关闭、尺寸限制)。事件过滤器提供非侵入式的事件处理方案,相比传统子类化方式更灵活,通过installEventFilter安装到目标控件即可实现各种交互增强功能。

yuhuasheng1997的博客 1484

emqtt安装过程

[root@templatetest08 emqttd]# uname  -aLinux templatetest08 3.10.0-693.11.6.el7.x86_64 #1 SMP Thu Jan 4 01:06:37 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux[root@templatetest08 emqttd]# lltotal 8drwxr-xr-...

大JAVA解决方案 4541

堆一呼一吸之间:动态扩缩容引发JVM堆内存震荡的伸缩算法、代际传导与容器定容解析

Kubernetes扩容后,新Java实例的GC频率常比老实例高出数倍,堆容量反复伸缩。本文从一次支付系统的GC陡增出发,结合HotSpot源码与JDK 8实测,拆解堆伸缩的记账规则:期望容量以GC后已用量为基数、以Xms为下限,按空闲比例判断扩缩,收缩只在老年代回收后按0%、10%、40%、100%步进;再剖析年轻代随老年代联动、晋升风暴与元空间触发线,对比Parallel、G1、ZGC等收集器及JDK 26的变化,讨论容器分账、HPA共振与原地扩缩容,最后给出分级定容、预热与监控的方案。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 15万+

IndicVoices HuggingFace工程实践完整指南:LFS指针、Parquet分片与大规模存储策略

IndicVoices 是一个覆盖 22 种印度语言的开源多语种语音数据集(speech dataset),已在 HuggingFace 平台开放,包含 11,200+ 小时转录音频与 51,000+ 位说话人。本文带你拆解这个 TB 级数据集的 HuggingFace 工程实践:Git LFS 指针文件、Parquet 分片策略、元数据组织与大规模存储设计,新手也能看懂并直接借鉴。 ## 一、

gitblog_00624的博客 948

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

ERLANG OS X 安装

网上随意找个来做笔记  方便下次安装滴时候

仅仅是对自己滴知识做一个总结 671

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Erlang组件 && Erlang工具和代码库

Erlang组件 Erlang具有许多单独的组件,它们能够在开发应用时作为组建块(building blocks)使用。同时这些组件也熟知Erlang的系统消息(load、unload、start、stop、restart、change code)。 Inets - HTTP 1.0服务器和FTP客户端。 Mnesia - 使用Erlang的分布式实时数据库。它支持RAM复制、磁

aweilark的专栏 1012

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Erlang简介

Erlang概述Erlang不但是一种编程语言,而且它具有比编程语言更加贴近操作系统的一些特性:并发线程、作业调度、内存管理、分布式、网络化等。据说使用Erlang编写的Yaws Web服务器,其并发性能是apache的15倍!这个Erlang初始开源版本包含了Erlang的实现,同时它也是用于构建分布式高可用性系统的Ericsson中间件的最大组成部分。Erlang具有以

chzms的专栏 1526

Erlang概述收藏

 Erlang概述收藏 新一篇: 什么是Python | 旧一篇: Ruby简介 function StorePage(){d=document;t=d.selection?(d.selection.type!=None?d.selection.createRange().text:):(d.getSelection?d.getSelection():);voi

skyremember的专栏 925

ERLang简介

Erlang入门  (2008-02-17 14:53:30) 标签:  it/科技       Erlang不但是一种编程语言,而且它具有比编程语言更加贴近操作系统的一些特性:并发线程、作业调度、内存管理、分布式、网络化等。据说使用Erlang编写的Yaws Web服务器,其并发性能是apache的15倍!Erlang具有以下特性:并发性 - Erlan...

狼之梦---爱乌及屋 318

Erlang 概述

Erlang概述 Erlang不但是一种编程语言,而且它具有比编程语言更加贴近操作系统的一些特性:并发线程、作业调度、内存管理、分布式、网络化等。据说使用Erlang编写的Yaws Web服务器,其并发性能是apache的15倍! 这个Erlang初始开源版本包含了Erlang的实现,同时它也是用于构建分布式高可用性系统的Ericsson中间件的最大组成部分。 Erla...

192

5分钟快速上手:Erlang RPM 零依赖部署终极指南

Erlang RPM 是一个专为 RabbitMQ 设计的零依赖 RPM 包,提供最小化的 Erlang/OTP 运行时环境。这个项目解决了企业部署中的关键痛点:传统 Erlang 安装复杂、依赖众多、体积庞大。通过精简优化,它只包含运行 RabbitMQ 必需的核心组件,让部署变得简单高效。 ## 项目核心价值与精准定位 ### 为什么需要零依赖 Erlang RPM? 在传统部署中,安装

gitblog_00584的博客 566

Erlang组件

<br />Erlang组件<br /><br />Erlang具有许多单独的组件,它们能够在开发应用时作为组建块(building blocks)使用。同时这些组件也熟知Erlang的系统消息(load、unload、start、stop、restart、change code)。<br /><br />Inets - HTTP 1.0服务器和FTP客户端。<br /><br />Mnesia - 使用Erlang的分布式实时数据库。它支持RAM复制、磁盘存储、动态改变shema、保存任意复杂的数据结构。

zhangxinrun的专栏 1230

Erlang概述

 Erlang概述 Erlang不但是一种编程语言,而且它具有比编程语言更加贴近操作系统的一些特性:并发线程、作业调度、内存管理、分布式、网络化等。据说使用Erlang编写的Yaws Web服务器,其并发性能是apache的15倍! 这个Erlang初始开源版本包含了Erlang的实现,同时它也是用于构建分布式高可用性系统的Ericsson中间件的最大组成部分。

朝阳之辉 1289

Erlang工具和组件

Erlang组件 Erlang具有许多单独的组件,它们能够在开发应用时作为组建块(building blocks)使用。同时这些组件也熟知Erlang的系统消息(load、unload、start、stop、restart、change code)。 Inets - HTTP 1.0服务器和FTP客户端。 Mnesia - 使用Erlang的分布式实时数据库。它支持RAM复制、磁

Lee的博客 1117

Erlang十分钟快速入门

这个Erlang初始开源版本包含了Erlang的实现,同时它也是用于构建分布式高可用性系统的Ericsson中间件的最大组成部分。Kernel - 运行Erlang系统所必须的C代码:Erlang内建功能(BIFs);代码、启动、命名服务;对网络show_ads_zone(13);   Erlang概述 Erlang不但是一种编程语言,而且它具有比编程语言更加贴近操作系统的一些

lee576的专栏 3942

[转] Erlang十分钟快速入门

Erlang概述Erlang不但是一种编程语言,而且它具有比编程语言更加贴近操作系统的一些特性:并发线程、作业调度、内存管理、分布式、网络化等。据说使用Erlang编写的Yaws Web服务器,其并发性能是apache的15倍!这个Erlang初始开源版本包含了Erlang的实现,同时它也是用于构建分布式高可用性系统的Ericsson中间件的最大组成部分。Erlang具有以下特性:并发性 - Er

heiyeluren的blog(黑夜路人的开源世界) 2014
上一篇: 从变量不可变到编程范式
下一篇: 一次erlang VM内存泄漏问题复盘
pyf725324
博客等级 码龄17年 6粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值