Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

npc install 在mac 上并不能实现守护进程的作用 #812

Open
sqzxcv opened this issue May 27, 2021 · 24 comments
Open

npc install 在mac 上并不能实现守护进程的作用 #812

sqzxcv opened this issue May 27, 2021 · 24 comments

Comments

@sqzxcv
Copy link

sqzxcv commented May 27, 2021

Describe the bug
npc install 在mac 上并不能实现守护进程的作用, 我看代码 npc install 之后只是把npc命令拷贝到了local/bin目录下, 这种方式在mac上并不能实现守护进程的作用.
mac 上实现守护进程的一个方法是通过launchctl来实现, 笼统的当做Linux我觉得是不够的
而且现在根据 文档中的方式部署mac 客户端存在以下问题:
用无配置文件安装启动mac客户端以后, 全局npc命令执行的时候, 会报找不到配置文件的问题"

2021/05/27 15:00:40.356 [I] [npc.go:231]  the version of client is 0.26.10, the core version of client is 0.26.0
2021/05/27 15:00:40.358 [E] [control.go:94]  Config file conf/npc.conf loading error open conf/npc.conf: no such file or directory

我看源码和文档很多地方, 都把mac 简单的当做了Linux来处理, 感觉这样有问题, mac和Linux很多地方一样, 也有一些地方不一样, 有必要专门对mac优化完善一下

@sqzxcv sqzxcv added the bug Something isn't working label May 27, 2021
@cnlh cnlh removed the bug Something isn't working label May 27, 2021
@cnlh
Copy link
Collaborator

cnlh commented May 27, 2021

不光是复制,有相关添加守护进程的操作

@sqzxcv
Copy link
Author

sqzxcv commented May 27, 2021

不光是复制,有相关添加守护进程的操作

你在Mac 上成功运行了npc了吗?(通过无配置文件的方式)

@sqzxcv
Copy link
Author

sqzxcv commented May 27, 2021

这地方开始执行安装操作:

case "install":

在实际执行的地方, 只有copy 文件的逻辑:

func copyStaticFile(srcPath, bin string) string {

没看见添加守护进程的逻辑呀, 你们mac上用什么方式实现守护进程的? 有没有具体测试过呢

@geek981108
Copy link
Contributor

geek981108 commented May 27, 2021

我认为是这样的, 题主提到了“无配置文件”, 我理解的无配置文件是通过cli传递flag来启动npc, 具体操作有如下几步:

1. 在下载文件夹执行 ./npc install 
2. 退回 home 目录,执行 npc -server=xxxxxxxxxx
3. 查看npc status

这种方式实测是没有问题的.

下面说第二种情况, 在第一步执行安装完成后, 进行 npc start, 不传递任何参数, 确实会报错, 这也是题主遇到的问题. 那么仔细阅读文档 注册:sudo ./npc install 其他参数(例如-server=xx -vkey=xx或者-config=xxx), 在第一步安装的时候传递这些参数, 即 ./npc install -server=xxxxxxxxxx --other-option=xxxxx, 安装完成后, 直接执行 npc start, 这时候不需要传递任何参数了, npc正常启动, 且这种方式触发了 launchctl 守护进程, plist located in: /Library/LaunchDaemons/Npc.plist.

通过阅读源码, 可以发现install带参数的本质也是将参数写到了文件中, 并保存起来以备使用.

题主可测一下.

@geek981108
Copy link
Contributor

另: 服务注册用 kardianos/service 实现的,所以在代码中搜不到 launchctl 字眼

@sqzxcv
Copy link
Author

sqzxcv commented May 28, 2021

我认为是这样的, 题主提到了“无配置文件”, 我理解的无配置文件是通过cli传递flag来启动npc, 具体操作有如下几步:

1. 在下载文件夹执行 ./npc install 
2. 退回 home 目录,执行 npc -server=xxxxxxxxxx
3. 查看npc status

这种方式实测是没有问题的.

下面说第二种情况, 在第一步执行安装完成后, 进行 npc start, 不传递任何参数, 确实会报错, 这也是题主遇到的问题. 那么仔细阅读文档 注册:sudo ./npc install 其他参数(例如-server=xx -vkey=xx或者-config=xxx), 在第一步安装的时候传递这些参数, 即 ./npc install -server=xxxxxxxxxx --other-option=xxxxx, 安装完成后, 直接执行 npc start, 这时候不需要传递任何参数了, npc正常启动, 且这种方式触发了 launchctl 守护进程, plist located in: /Library/LaunchDaemons/Npc.plist.

通过阅读源码, 可以发现install带参数的本质也是将参数写到了文件中, 并保存起来以备使用.

题主可测一下.

你的测试环境是mac吗? 事实上, 我就是使用文档中描述的方法,

注册:sudo ./npc install -server=xx -vkey=xxx -type=tcp
然后运行: npc start

这种情况下, 我在其他目录下执行npc status 提示找不到配置文件

2021/05/27 15:00:40.356 [I] [npc.go:231]  the version of client is 0.26.10, the core version of client is 0.26.0
2021/05/27 15:00:40.358 [E] [control.go:94]  Config file conf/npc.conf loading error open conf/npc.conf: no such file or directory

而且这种方式运行一段时间以后, 发现npc退出以后没有重启, 导致业务很长时间断链了

@geek981108
Copy link
Contributor

geek981108 commented May 28, 2021

Screen Shot 2021-05-28 at 2 54 12 PM

通过代码和实际测试,我不认为 install 有问题,可以排查下 install 传递参数后是否创建了配置文件,big Sur 之后进一步收紧目录权限,总会出现奇奇怪怪的文件权限问题,建议也排查下
@sqzxcv

@sqzxcv
Copy link
Author

sqzxcv commented May 28, 2021

Screen Shot 2021-05-28 at 2 54 12 PM

通过代码和实际测试,我不认为 install 有问题,可以排查下 install 传递参数后是否创建了配置文件,big Sur 之后进一步收紧目录权限,总会出现奇奇怪怪的文件权限问题,建议也排查下
@sqzxcv

我看了一下, 好像plist没有创建, 我的是11.1, M1芯片

@sqzxcv
Copy link
Author

sqzxcv commented May 28, 2021

我现在的做法是自己用launchctl 做了守护进程, 程序运行没问题, 但是刚遇到一个情况: npc断线以后过了两个小时一直没连上nps服务器, 实际上在客户端上nps web网站是能打开的. 我观察日志, 中间好像有3个小时npc什么都没做, 也没重连:

2021/05/28 11:20:00.023 [E] [client.go:63]  The connection server failed and will be reconnected in five seconds, error EOF
2021/05/28 11:20:10.194 [E] [client.go:63]  The connection server failed and will be reconnected in five seconds, error EOF
2021/05/28 11:20:20.364 [E] [client.go:63]  The connection server failed and will be reconnected in five seconds, error EOF
2021/05/28 11:20:25.584 [I] [client.go:72]  Successful connection with server om.mutangxiaxia.com:8024
2021/05/28 11:20:30.670 [E] [client.go:158]  connect to  om.mutangxiaxia.com:8024 error: EOF
2021/05/28 14:38:08.351 [E] [client.go:92]  Accept server data error EOF, end this service
2021/05/28 14:38:08.352 [I] [npc.go:236]  Client closed! It will be reconnected in five seconds
2021/05/28 14:38:13.509 [I] [client.go:72]  Successful connection with server om.mutangxiaxia.com:8024
2021/05/28 14:38:35.547 [D] [client.go:200]  http request, method GET, host home.mutangxiaxia.com:85, url /albums/aqtrglv3me2l6xoi/pi-pi-ba, remote address

你看从11点20 之前已经断线, 一直在重连, 但是11点20 之后, 到14点38中间什么日志都没有, 客户端服务也访问不了

@sqzxcv
Copy link
Author

sqzxcv commented May 28, 2021

现在npc又掉线了

@geek981108
Copy link
Contributor

WechatIMG751

WechatIMG750

刚编了一下M1,也是没有问题的,守护进程能自动创建 @sqzxcv

@sqzxcv
Copy link
Author

sqzxcv commented May 28, 2021

你们有没有开发群组, 我要不本地尝试debug一下

@sqzxcv
Copy link
Author

sqzxcv commented May 28, 2021

守护进程的问题, 我自己用launchctl解决了, 现在头疼的就是断线重连的问题
断线以后要过很久才能连上服务器

@geek981108
Copy link
Contributor

守护进程的问题, 我自己用launchctl解决了, 现在头疼的就是断线重连的问题
断线以后要过很久才能连上服务器

看 Log 不像是一直再重连,更像是服务停止了,因为看代码如果连接不上会每 5S Retry 且会打印 Log,mac 是不是休眠了,或者 launchctl 配置的问题?可以对比下我上传的截图,看下launchctl 配置。

你们有没有开发群组, 我要不本地尝试debug一下

我不是开发组成员,不清楚有没有群组

@sqzxcv
Copy link
Author

sqzxcv commented May 28, 2021

没有休眠, 我客户端主机屏幕一直在工作, 而且我查看了npc进程是存在的.

2021/05/28 14:56:24.584 [E] [client.go:63]  The connection server failed and will be reconnected in five seconds, error EOF
2021/05/28 14:56:34.678 [E] [client.go:63]  The connection server failed and will be reconnected in five seconds, error EOF
2021/05/28 14:56:44.809 [E] [client.go:63]  The connection server failed and will be reconnected in five seconds, error EOF
2021/05/28 14:56:54.924 [E] [client.go:63]  The connection server failed and will be reconnected in five seconds, error EOF
2021/05/28 14:57:05.039 [E] [client.go:63]  The connection server failed and will be reconnected in five seconds, error EOF
2021/05/28 14:57:10.170 [I] [client.go:72]  Successful connection with server om.mutangxiaxia.com:8024
2021/05/28 14:57:15.246 [E] [client.go:158]  connect to  om.mutangxiaxia.com:8024 error: EOF

-----


你看有出息了, 15点之前断线了, 现在又不再重新了,
image
npc进程是活着的, cpu 0.0%

@geek981108
Copy link
Contributor

我之前发现 clash 开启增强模式,有可能导致断线。断线时候 telnet server 看 server 活着没?
@sqzxcv

@sqzxcv
Copy link
Author

sqzxcv commented May 28, 2021

守护进程的问题, 我自己用launchctl解决了, 现在头疼的就是断线重连的问题
断线以后要过很久才能连上服务器

看 Log 不像是一直再重连,更像是服务停止了,因为看代码如果连接不上会每 5S Retry 且会打印 Log,mac 是不是休眠了,或者 launchctl 配置的问题?可以对比下我上传的截图,看下launchctl 配置。

你们有没有开发群组, 我要不本地尝试debug一下

我不是开发组成员,不清楚有没有群组

截屏2021-05-28 下午3 29 02

这个配置文件是我其他服务拷贝过来的, 应该是没问题的

@sqzxcv
Copy link
Author

sqzxcv commented May 28, 2021

我之前发现 clash 开启增强模式,有可能导致断线。断线时候 telnet server 看 server 活着没?
@sqzxcv

截屏2021-05-28 下午3 33 06
telnet 是正常的

@sqzxcv
Copy link
Author

sqzxcv commented May 28, 2021

感觉像是npc 里面线程阻塞了? 死循环?

@geek981108
Copy link
Contributor

感觉像是npc 里面线程阻塞了? 死循环?

有点意思,我看看

@geek981108
Copy link
Contributor

mux: read session unpack from connection err EOF
log 中有没有这样的字眼,我kill掉server后,client log 如上

@sqzxcv

@sqzxcv
Copy link
Author

sqzxcv commented May 28, 2021

unpack from connection

没有这种log

@maxzhang666
Copy link

所以楼主是怎么解决守护问题的呢?

我两种方式都尝试了 在别的目录下始终都会提示找不到配置文件

只有在原始目录的时候status命令才可以正常(我配置文件里也写了服务器地址)

@zomco
Copy link

zomco commented Dec 19, 2021

  1. 编辑在/Library/LaunchDaemons/Npc.plist
    添加配置<string>-config=/path/to/config</string>
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd" >
<plist version='1.0'>
  <dict>
    <key>Label</key>
    <string>Npc</string>
    <key>ProgramArguments</key>
    <array>
      <string>/usr/local/bin/npc</string>
    
      <string>-config=/path/to/config</string>
      
      <string>-debug=false</string>
    
    </array>
    
    
    
    <key>SessionCreate</key>
    <false/>
    <key>KeepAlive</key>
    <true/>
    <key>RunAtLoad</key>
    <true/>
    <key>Disabled</key>
    <false/>
    
    <key>StandardOutPath</key>
    <string>/usr/local/var/log/Npc.out.log</string>
    <key>StandardErrorPath</key>
    <string>/usr/local/var/log/Npc.err.log</string>
  
  </dict>
</plist>
  1. 重启守护
    sudo launchctl unload /Library/LaunchDaemons/Npc.plist
    sudo launchctl load /Library/LaunchDaemons/Npc.plist

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants