process_flag(trap_exit, true)

探讨了Erlang中使用特定函数后进程无法被正常杀死的现象,尤其是在由supervisor启动的gen_server进程中,即使尝试通过supervisor进行杀死也不会收到预期的退出消息,而是直接进入terminate函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前提

erlang进程用了这个函数后,再用exit(Pid,Reason),就不能再杀死进程了(除非Reason=kill),但会发{‘EXIT’, From, Reason}给Pid进程

问题

在有supervisor启动的gen_server进程,由supervisor进程去杀死gen_server进程时,却不会收到信息,而是直接走terminate函数

结论

原来这是erlang官方的特殊设定
这里写图片描述
详见 http://erlang.org/doc/man/gen_server.html#Module:terminate-2

<think>好的,我需要分析用户提供的Bash脚本是否存在问题。首先,用户提到脚本用于监控和重启名为trickprotocol的进程。根据用户提供的类似脚本示例(引用[2]),原脚本可能存在一些常见问题。 首先,用户之前的脚本中使用的是`ps | grep check_process`来查找进程,但这种方法可能会有误判。例如,当grep自身的命令也包含进程名时,会被误统计进去。不过在这个例子中,用户用了`grep -v "grep"`来排除grep进程,但这种方法并不完全可靠,尤其是当进程名的一部分和grep参数匹配时。可能需要使用更精确的匹配方式,比如用`pgrep`命令或者`pidof`。 其次,循环结构的问题。原示例中使用的是`while [ 1 ]`,虽然可以运行,但更规范的写法应该是`while true`,这样可读性更好。此外,脚本中没有处理信号,如果脚本被中断,可能会留下僵尸进程或者未完成的子进程。可以考虑添加trap命令来捕获信号,做一些清理工作。 另一个问题是进程启动部分。在示例中,当进程未运行时,只是输出信息,没有实际启动的命令。用户需要确保在检测到trickprotocol未运行时,执行正确的启动命令,比如`/path/to/trickprotocol &`。同时,可能需要考虑后台运行和日志记录,避免脚本阻塞。 另外,检查进程是否存在的方式可能需要改进。例如,使用`ps -C trickprotocol`来直接按进程名检查,或者使用`pidof trickprotocol`,这样更准确,避免误判。此外,原示例中的变量赋值`flag=$(ps | grep ... | wc -l)`可能存在竞争条件,或者在进程刚好在检查后结束的情况,导致判断不准确。应该尽量减少检查的时间窗口。 还有,原脚本中的条件判断`if [ $flag = "1" ]`可能存在字符串比较的问题,尤其是在不同shell环境下,数字比较应该使用`-eq`运算符,而不是字符串比较。此外,如果进程存在多个实例,比如多个trickprotocol进程,可能需要调整判断逻辑。 最后,脚本的睡眠时间设置为5秒,这可能根据实际需求调整,但需要确保不会过于频繁地检查,消耗资源,或者间隔过长导致进程未能及时重启。此外,可能需要添加日志功能,记录每次检查和重启的时间,便于后续排查问题。 总结一下,主要问题可能包括:进程检测方法不准确,循环结构可优化,信号处理缺失,启动命令未正确实施,条件判断运算符不正确,以及可能的资源竞争和日志记录不足。需要逐一检查并修正这些部分,确保脚本的可靠性和健壮性。</think>以下是对监控脚本的逐步分析及改进建议: ### 原始脚本问题分析 ```bash #!/bin/bash while [ 1 ] do flag=$(ps | grep trickprotocol | grep -v "grep" | wc -l) if [ $flag = "1" ] then echo "RUNNING!" else echo "Stopped. Restarting..." # 缺少实际启动命令 fi sleep 5 done ``` #### 1. 进程检测不准确 - **问题**:`ps | grep`命令可能匹配到包含"trickprotocol"的其他无关进程,例如`/usr/bin/trickprotocol-backup` - **改进**:使用`pgrep -x`精确匹配进程名 ```bash flag=$(pgrep -x trickprotocol | wc -l) ``` #### 2. 无限循环写法不规范 - **问题**:`while [ 1 ]`不符合Bash最佳实践 - **改进**:使用标准格式`while true` ```bash while true ``` #### 3. 缺少信号处理 - **问题**:CTRL+C终止脚本后可能遗留未完成操作 - **改进**:添加信号捕获 ```bash trap "echo 'Script terminated'; exit" SIGINT SIGTERM ``` #### 4. 进程启动逻辑缺失 - **问题**:else分支缺少实际启动命令 - **改进**:添加带错误处理的启动命令 ```bash /path/to/trickprotocol > /var/log/trickprotocol.log 2>&1 & ``` ### 完整改进脚本 ```bash #!/bin/bash trap "echo '监控脚本已终止'; exit" SIGINT SIGTERM LOG_FILE="/var/log/trickprotocol_monitor.log" PROCESS_PATH="/usr/local/bin/trickprotocol" while true do if pgrep -x "trickprotocol" > /dev/null then echo "$(date) - RUNNING" >> $LOG_FILE else echo "$(date) - 进程停止,正在重启..." >> $LOG_FILE $PROCESS_PATH >> $LOG_FILE 2>&1 & # 二次验证启动结果 sleep 2 if ! pgrep -x "trickprotocol" > /dev/null then echo "$(date) - 重启失败!" >> $LOG_FILE fi fi sleep 30 # 调整检测间隔 done ``` ### 关键改进点说明 1. **精确进程检测**:`pgrep -x`确保精确匹配完整进程名[^2] 2. **日志记录**:所有操作记录到日志文件便于追溯 3. **启动验证**:增加2秒延迟后二次检查确保启动成功 4. **错误重定向**:`2>&1`将标准错误合并输出到日志 5. **合理检测间隔**:延长检测周期到30秒降低系统负载
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值