Ubuntu16.04.6 | 安装Cinnamon3.0

概述

Cinnamon[1]是Linux Mint[2]的默认桌面环境。不同于 Ubuntu 的 Unity 桌面环境,Cinnamon 是一个更加传统而优雅的桌面环境,其带有底部面板和应用菜单。由于 Cinnamon 桌面以及它类 Windows 的用户界面,许多桌面用户相较于 Ubuntu 更喜欢 Linux Mint[3]。

现在你无需安装 Linux Mint[4]就能够体验到 Cinnamon了。在这篇教程,我将会展示给你如何在 Ubuntu 18.04,16.04 和 14.04 上安装 Cinnamon。

……

阅读全文

Ubuntu | version `GLIBC_2.27‘ not found错误

version `GLIBC_2.27’ not found错误

执行strings /lib/x86_64-linux-gnu/libc.so.6 | grep GLIBC_ 结果显示如下:

GLIBC_2.2.5
GLIBC_2.2.6
GLIBC_2.3
GLIBC_2.3.2
GLIBC_2.3.3
GLIBC_2.3.4
GLIBC_2.4
GLIBC_2.5
GLIBC_2.6
GLIBC_2.7
GLIBC_2.8
GLIBC_2.9
GLIBC_2.10
GLIBC_2.11
GLIBC_2.12
GLIBC_2.13
GLIBC_2.14
GLIBC_2.15
GLIBC_2.16
GLIBC_2.17
GLIBC_2.18
GLIBC_2.22
GLIBC_2.23
GLIBC_2.24
GLIBC_PRIVATE

去清华开源站点下载glibc: https://mirrors.tuna.tsinghua.edu.cn/gnu/libc/
下载好文件后解压

$ tar -zxvf glibc-2.27.tar.gz

进入 glibc-2.27 目录,创建 build 目录

……

阅读全文

Docker | 容器退出码详解

docker查看退出码指令

$ docker ps --filter "status=exited"
$ docker inspect  container-id --format='{<!-- -->{.State.ExitCode}}'

常见退出码

Exit Code 0

  • 退出代码0表示特定容器没有附加前台进程。
  • 该退出代码是所有其他后续退出代码的例外。
  • 这不一定意味着发生了不好的事情。如果开发人员想要在容器完成其工作后自动停止其容器,则使用此退出代码。

Exit Code 1

  • 程序错误,或者Dockerfile中引用不存在的文件,如 entrypoint中引用了错误的包
  • 程序错误可以很简单,例如“除以0”,也可以很复杂,比如空引用或者其他程序 crash

Exit Code 137

  • 此状态码一般是因为 pod 中容器内存达到了它的资源限制(resources.limits),一般是内存溢出(OOM),CPU达到限制只需要不分时间片给程序就可以。因为限制资源是通过 linux 的 cgroup 实现的,所以 cgroup 会将此容器强制杀掉,类似于kill -9
  • 还可能是宿主机本身资源不够用了(OOM),内核会选取一些进程杀掉来释放内存
  • 不管是 cgroup 限制杀掉进程还是因为节点机器本身资源不够导致进程死掉,都可以从系统日志中找到记录(journalctl -k)

Exit Code 139

  • 表明容器收到了SIGSEGV信号,无效的内存引用,对应kill -11
  • 一般是代码有问题,或者 docker 的基础镜像有问题

Exit Code 143

  • 表明容器收到了SIGTERM信号,终端关闭,对应kill -15
  • 一般对应docker stop 命令
  • 有时docker stop也会导致Exit Code 137。发生在与代码无法处理SIGTERM的情况下,docker进程等待十秒钟然后发出SIGKILL强制退出。

不常用的一些 Exit Code

  • Exit Code 126: 权限问题或命令不可执行
  • Exit Code 127: Shell脚本中可能出现错字且字符无法识别的情况
  • Exit Code 1 或 255:因为很多程序员写异常退出时习惯用 exit(1) 或 exit(-1),-1 会根据转换规则转成 255。这个一般是自定义 code,要看具体逻辑。

退出状态码的区间

  • 必须在 0-255 之间,0 表示正常退出- 外界将程序中断退出,状态码在 129-255- 程序自身异常退出,状态码一般在 1-128- 假如写代码指定的退出状态码时不在 0-255 之间,例如: exit(-1),这时会自动做一个转换,最终呈现的状态码还是会在 0-255 之间。我们把状态码记为 code,当指定的退出时状态码为负数,那么转换公式如下:256 – (|code| % 256) 参考链接: https://imroc.io/posts/kubernetes/analysis-exitcode/
……

阅读全文

Openresty二 | postman小工具

用到的知识点

mvc架构
模型渲染库:https://github.com/bungle/lua-resty-template
resty http请求库: https://github.com/bungle/lua-resty-template

参照 mvc模型来做postman工具

配置文件说明

worker_processes  1;
error_log logs/error.log;
events {
    worker_connections 1024;
}
http {
    lua_package_path "/open_resty/lualib/?.lua;/usr/local/openresty/lualib/?.lua;";
    server {
        listen 8080;
        default_type 'application/json;charset=utf8';
        lua_code_cache off;

        location /  {
            content_by_lua_file mvc.lua;
        }

        location ~ ^/js/|^/css/|\.html {
            root static;
        }
    }
}
  • lua_code_cache off; 是为了修改lua脚本后不用重启nginx自动加载lua。- lua_package_path: lua脚本路径- root static: 静态目录是static

入口文件/解析uri

mvc.lua

……

阅读全文

Openresty一 | 初探

概述

OpenResty®是一个基于Nginx与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

OpenResty®通过汇聚各种设计精良的Nginx模块(主要由 OpenResty 团队自主开发),从而将Nginx有效地变成一个强大的通用 Web 应用平台。这样,Web 开发人员和系统工程师可以使用 Lua 脚本语言调动Nginx支持的各种 C 以及 Lua 模块,快速构造出足以胜任 10K 乃至 1000K 以上单机并发连接的高性能 Web 应用系统。

……

阅读全文

LastBattle | 登录流程(LS & BS & GS)

登录流程

根据上一篇文章中的登录流程,我在工程中找到了相应的代码并记录了下来

登录服务代码解析

监听端口:49997 供BS服务连接
监听端口:49996 供客户端连接

CIocpCtrl:IOCP控制类

多线程循环查询IOCP内部的网络事件,并分派处理.这里多个工作线程仅仅是将所有的网络事件放入循环
内部将创建2 * CPU个工作线程(Worker Item).
多线程调用函数

……

阅读全文

LastBattle | 服务架构

服务器架构简图如下:

连线说明:

  • 实线:表示客户端登录流程,①②③④⑤表示登录流程,详细解释见下文。
  • 虚线:表示服务器间的连接,虚线箭头指向监听方。

架构说明:

|英文名称|简称|中文名称|功能简介|单个大区需求数量|数量说明 |—— |GameClient|GC|游戏客户端|不解释|n|不超服务器承载上限均可 |LoginSer|LS|游戏登录服务器|用于登录验证的服务器|1|登录入口仅需一个 |GateSer|GS|游戏网关服务器|用于客户端与其场景服和中心服通讯的转接|n|根据客户端连接数量调整 |BalanceSer|BS|游戏负载均衡服务器|用于负载均衡,给客户端分配合理的网关服,其上连接多台GS|n|根据实际需求配置 |SceneSer|SS|游戏场景服务器|用于游戏战斗的服务器|n|根据实际需求配置 |CentralSer|CS|游戏中心服务器|用于玩家数据管理,匹配等核心功能服务器|1|统一管理玩家数据 |LogSer||游戏日志服务器|用于游戏日志收集|1|统一日志收集 |UserRedis||游戏玩家数据缓存服务器|用于缓存玩家数据|1|统一数据缓存 |LogicRedis||游戏逻辑数据缓存服务器|用于缓存游戏数据|1|统一数据缓存 |MySql||游戏数据库|用于持久化游戏及玩家数据|1|统一数据存储 |Remote||游戏远程控制端|用于输入gm命令等远程控制|n|根据实际需求配置

……

阅读全文

Cgo | 使用libevent库实现一个定时器

使用libevent库作为例子

下载 & 编译 & 安装libevent


$ git clone https://github.com.cnpmjs.org/libevent/libevent.git

$ cd libevent && mkdir build && cd build


$ cmake ..

$ make

libevent实现的定时器


// main.cpp

#include "event.h"


struct event ev;

struct timeval tv;

void time_cb(evutil_socket_t fd, short event, void *argc)

{

  printf("timer wakeup\n");

  event_add(&ev, &tv); // reschedule timer

}


int main()
{

  struct event_base *base = event_base_new();

  tv.tv_sec = 2;

  tv.tv_usec = 0;


  evtimer_set(&ev, time_cb, NULL);

  event_base_set(base, &ev);

  event_add(&ev, &tv);

  event_base_dispatch(base);


  event_base_free(base);

}

go调用libevent实现定时器

把编译好的头文件和库文件放到go工程里

……

阅读全文