前言&背景 平时在做一些开发时难免要调一些shell脚本或者外部程序,golang提供了exec包很方便的帮我们解决了这个问题。但是当外部程序或者shell脚本夯死就使得我们自身的程序很不稳定。与此同时,当我们已经感知到程序脚本运行出现问题时,我们可能需要立刻对程序进行杀死的操作,但是当我们很自然的想到cmd.Process.Kill()时,我们又遇上了另外一个问题,因为这个操作并没有将子进程kill掉,所以我们的需求就出来了,那就是: Kill进程及其子进程 首先给出解决方案,那就是kill掉进程组 给出一个有测试和原理分析的相关链接,我这里也来说下具体用法。 cmd := exec.Command("/bin/sh", "-c", "...........") // Go会将PGID设置成与PID相同的值 cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true} syscall.Kill(-cmd.Process.Pid 继续阅读 >>


朱新全 18/08/05 12:04:20
背景 在使用golang的struct tag进行json和db映射的时候,发现有这么一行和其它不一样,本以为是冒号或者分号中英文不对的问题,但是细细寻找一遍之后无果,这一行就一直报这个错误,很尴尬,明明和其它行的用法一样,但就是有这种警告,而且程序运行时也确实映射不到,最后找到了错误,是空格的tab的区别。。。。 没错,这里只能用空格,不能用tab。。。就是如此坑。。。。但是goland IDE早已帮你想到了解决办法,smart tab 哈哈,设置方法见最后一张图。 Bad syntax for struct tag value less… (⌘F1) Inspection info: Verifies that struct tags conform to Go conventions. According to these conventions, tag strings are a concatenation of optionally space-separated 继续阅读 >>


朱新全 18/08/04 14:16:27
背景: 在使用React进行前端页面的开发,使用antd的Input组件时,本想利用onChange事件的event.target.value获取正在修改的值,但是一直报错为空,下面是控制台的报错信息: This synthetic event is reused for performance reasons. If you’re seeing this, you’re accessing the property target on a released/nullified synthetic event. This is set to null. If you must keep the original synthetic event around, use event.persist(). See https://fb.me/react-event-pooling for more information. 解决方法: 在操作event之前,先写如下语句: e.persist 继续阅读 >>


朱新全 18/05/11 20:46:08
借鉴这里的SQL用法,挺全面的:MySQL 【去重留一】一条sql语句完成 思路总结 背景,CSDN网站最近好像在做 http 到 https 的转换,所以之前写的群博中本身博客唯一标示的 url 就出现了变化,导致数据库中存在重复的博客内容 解决办法 先贴下SQL delete T_blog from T_blog, (select Title from T_blog where BlogArticleLink like 'https://blog.csdn.net%') as t2 where T_blog.Title = t2.Title and (BlogArticleLink like '//blog.csdn.net%' or BlogArticleLink like 'http://blog.csdn.net%'); 其实就是从T_blog表中删除标题相同的但博客链接又有差别的重复行 上面用的SQL之前没用过的是直接使用select语句又得到了一个新的临 继续阅读 >>


朱新全 18/03/24 10:52:15
下面是我在启动虚拟机时的报错: Runtime error opening '/home/zxq/VirtualBox VMs/win-10/win-10.vbox' for reading: -38(Access denied.). /Main/src-server/MachineImpl.cpp[745] (nsresult Machine::i_registeredInit()). 我的情形是在我用root用户启动了一次虚拟机之后,再通过一般用户启动了虚拟机,看到了Access denied,首先就是文件的权限问题,总之我这里就是这个问题。 找到虚拟机的目录: 里面的win-10.vbox这个文件的属主之前是root,所以这里将它的属主改回普通用户即可: sudo chown zxq:zxq ./win-10.box 作者:zhuxinquan61 发表于 2017/12/17 20:2 继续阅读 >>


朱新全 17/12/17 20:24:13
原文链接:https://javasgl.github.io/go-get-golang-x-packages/ 侵权联系删除! go在go get 一些 package时候的会由于众所周知的原因而无法下载。比如在安装 bee的时候有可能会遇到无法下载 golang.org/x/sys/unix 的问题。 unrecognized import path "golang.org/x/sys/unix" 解决方案:手动从github下载相应的package git clone --depth=1 https://github.com/golang/xxx.git git clone --depth=1 https://github.com/golang/xxx.git 注:xxx 为对应的需要的库 举例:这里要下载golang.org/x/sys/unix, 对应到github地址为:github.com/golang/sys.git 。 下载完成后,软链或者复制 到 $GO 继续阅读 >>


朱新全 17/10/15 08:55:53
原文链接:INTRODUCTION TO CONTROL GROUPS (CGROUPS) Red Hat Enterprise Linux 6 提供了一个新的内核功能:控制组(control groups),在本文中我们称它为 cgroups 。Cgroups允许你对在系统上运行的用户定义的任务组(进程)进行资源分配(例如CPU时间,系统内存,网络带宽或这些资源的组合)。你可以监视你配置的cgroup,拒绝cgroups访问某些资源,甚至可以在正在运行的系统上动态重新配置cgroups。可以将cgconfig(cgroup的配置)服务配置为在系统启动时自动启动,并且在启动时重新建立预定义的cgroup,从而使它们在重新启动时保持不变。 通过使用cgroups,系统管理员在分配、排序、拒绝、管理和监控系统资源上可以进行细粒度的控制。硬件资源也可以在任务和用户之间适当分配,提升整体效率。 1.1. Cgroups 是如何组织的 Cgroups 分层次的组织,如同进程一样,cgroups 子节点集成了父节点的一些属性。但是,这两种模式(进程和cgrou 继续阅读 >>


朱新全 17/09/28 16:54:34
环境的配置总是令人作呕,所以这次表明版本条件: 首先,这是一台新机器 其次,CentOS版本如下: [root@pc ~]# cat /etc/redhat-release CentOS release 6.7 (Final) 再者,要安装的Mysql版本如下: [root@pc ~]# mysql --version mysql Ver 14.14 Distrib 5.7.19, for Linux (x86_64) using EditLine wrapper 切记对号入座,任何条件不符合的不保证能安装成功 首先,本身是一台新的机器,所以按照这里的链接我安装成功了,还是贴下原文: Step1: 检测系统是否自带安装mysql # yum list installed | grep mysql Step2: 删除系统自带的mysql及其依赖命令: # yum -y remove mysql-libs.x86_64 Step3: 给Cent 继续阅读 >>


朱新全 17/07/22 18:27:05
beego框架算是golang比较成熟的一个框架了,最近看了下这个框架其中的一个在线聊天室的例子,觉得还是有很多可以学习借鉴的地方,所以就总结下。 这个例子的源码在这里,该例子配合bee工具可以很简单的进行运行。 首先看下这个项目的结构: 标准的beego框架,各个文件夹包含了不同的功能。 然后我们从main.go(这里是WebIM.go)看起: package main import ( "github.com/astaxie/beego" "github.com/beego/i18n" "github.com/beego/samples/WebIM/controllers" ) const ( APP_VER = "0.1.1.0227" ) func main() { beego.Info(beego.BConfig.AppName, APP_VER) // Register routers. beego.Rout 继续阅读 >>


朱新全 17/06/29 12:08:47
在不了解这个问题之前,在网上搜索一下竟然搜出了两个完全相反的结果,所以打算自己测试下这个问题。 首先给出结论: 在同一个package中,可以多个文件中定义init方法 在同一个go文件中,可以重复定义init方法 在同一个package中,不同文件中的init方法的执行按照文件名先后执行各个文件中的init方法 在同一个文件中的多个init方法,按照在代码中编写的顺序依次执行不同的init方法 下面看下测试的代码: 在当前目录下新建main.go及testinit目录,在testinit目录下共有三个文件:123.go、ini1.go、ini2.go,各个源码文件分别如下: 123.go package testinit import "fmt" func init(){ fmt.Println("123init") } ini1.go package testinit import "fmt" func init(){ fmt.Println("i 继续阅读 >>


朱新全 17/06/25 14:24:39