[{"data":1,"prerenderedAt":242},["ShallowReactive",2],{"archive-2016-9-1":3},{"title":4,"articles":5,"hot_article":27,"month_arch":90,"total":238,"cover":239},"2016年9月 - 独孤影的博客",[6,17],{"id":7,"title":8,"uri":8,"author":9,"tags":10,"created_at":14,"view_count":15,"content":16},47,"关于kill进程链","duguying",[11,12,13],"进程","子进程","kill","2016-09-30 00:02:21",2926,"\u003Cp>之前在做 Goj 项目的时候执行服务器部分使用 go 语言 kill 进程，发现无法 kill 该进程的子进程，后来发现貌似别的语言也无法直接 kill 掉当前进程的子进程链。kill 子进程链的应用场景是这样的，我在做 judger服务器的时候发现我调用 gcc 编译源码会在某些极端的情况下卡死，然后卡死后我需要 kill 掉 gcc 的进程，我使用 go 语言的相关 api kill 掉 gcc (因为我拿得到 gcc 的进程 id)，然而，我发现 gcc 会调用别的命令，记忆中貌似是一个叫做 ar 的命令，实际上是这个子进程卡死了，于是我 kill 掉身为父进程的 gcc 之后，它的子进程依然存在，变成了孤儿进程，继续卡着。但是我没有 api 可以拿到 gcc 卡死的子进程的进程 id，所以我也无法 kill 掉它。我当时的临时解决方案是调用 killall 命令去按照名称杀掉它。\u003C\u002Fp>\u003Cp>之后一次在某个群里提到这件事情，随口问了一句如何获取某个进程的子进程，linux api 中是没有这种 api 的，一位同学提醒了我，你可以从 \u002Fproc 目录中查。今天我用 go 语言实现了它，linux 系统中 \u002Fproc 目录记录了所有的进程信息，但是这些信息中依然没有记录某个信息的子进程，不过它记录了某个进程的父进程，于是我遍历了 \u002Fproc 目录中的所有进程的进程信息，然后根据进程的父代关系构成了一颗进程树，这颗树的顶端必定是 init 进程，于是，我便可以从这颗进程树上从上往下搜索查找出某个进程的子进程了。这样一来，一个简单的进程树便可以让我轻松的查找出某进程的子进程，同样也可以 kill 掉某颗进程树，将当前进程及其子进程 kill 掉已经不再是一件难事了。\u003C\u002Fp>\u003Cp>如果你对此感兴趣，欢迎参阅源码&nbsp;\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fgojudge\u002Fproc\" _src=\"https:\u002F\u002Fgithub.com\u002Fgojudge\u002Fproc\">https:\u002F\u002Fgithub.com\u002Fgojudge\u002Fproc\u003C\u002Fa>&nbsp;\u003C\u002Fp>\u003Cp>最后，我要说明的一点是：世界上没有什么事情是一棵树解决不了的，如果有，那么两颗树一定能够解决。\u003C\u002Fp>",{"id":18,"title":19,"uri":19,"author":9,"tags":20,"created_at":24,"view_count":25,"content":26},45,"Hibernate中自动建表unique无效的问题",[21,22,23],"Hibernate","建表","unique","2016-09-10 14:14:32",3560,"\u003Cp>使用Hibernate自动建表，User实体中的username字段希望给个唯一约束，但是自动建表却一直没有unique约束\u003C\u002Fp>\u003Cpre class=\"brush:java;toolbar:false\">@Entity\n@Table(name&nbsp;=&nbsp;&quot;user&quot;)\npublic&nbsp;class&nbsp;User&nbsp;{\n\tprivate&nbsp;int&nbsp;id;\n\tprivate&nbsp;String&nbsp;username;\n\n\t@Id\n\t@GeneratedValue(strategy&nbsp;=&nbsp;GenerationType.IDENTITY)\n\tpublic&nbsp;int&nbsp;getId()&nbsp;{\n\t\treturn&nbsp;id;\n\t}\n\n\tpublic&nbsp;void&nbsp;setId(int&nbsp;id)&nbsp;{\n\t\tthis.id&nbsp;=&nbsp;id;\n\t}\n\n\t@Column(unique&nbsp;=&nbsp;true,&nbsp;nullable&nbsp;=&nbsp;false)\n\tpublic&nbsp;String&nbsp;getUsername()&nbsp;{\n\t\treturn&nbsp;username;\n\t}\n\n\tpublic&nbsp;void&nbsp;setUsername(String&nbsp;username)&nbsp;{\n\t\tthis.username&nbsp;=&nbsp;username;\n\t}\n\n}\u003C\u002Fpre>\u003Cp>键表的结果是索引中并没有唯一索引，多番尝试解决如下\u003Cbr\u002F>\u003C\u002Fp>\u003Cpre class=\"brush:java;toolbar:false\">@Entity\n@Table(name&nbsp;=&nbsp;&quot;user&quot;)\npublic&nbsp;class&nbsp;User&nbsp;{\n\tprivate&nbsp;int&nbsp;id;\n\tprivate&nbsp;String&nbsp;username;\n\n\t@Id\n\t@GeneratedValue(strategy&nbsp;=&nbsp;GenerationType.IDENTITY)\n\tpublic&nbsp;int&nbsp;getId()&nbsp;{\n\t\treturn&nbsp;id;\n\t}\n\n\tpublic&nbsp;void&nbsp;setId(int&nbsp;id)&nbsp;{\n\t\tthis.id&nbsp;=&nbsp;id;\n\t}\n\n\t@Column(unique&nbsp;=&nbsp;true,&nbsp;length&nbsp;=&nbsp;20,&nbsp;nullable&nbsp;=&nbsp;false)\n\tpublic&nbsp;String&nbsp;getUsername()&nbsp;{\n\t\treturn&nbsp;username;\n\t}\n\n\tpublic&nbsp;void&nbsp;setUsername(String&nbsp;username)&nbsp;{\n\t\tthis.username&nbsp;=&nbsp;username;\n\t}\n\n}\u003C\u002Fpre>\u003Cp>原因是我未指定 username 字段的长度，然后自动建表的字段长度是255字符，于是没有唯一索引，将长度指定为 20 ，删除表，重新执行建表便有了唯一索引。另需注意的是 nullable = false 。\u003C\u002Fp>",{"title":28,"list":29},"最热文章",[30,36,42,48,54,60,66,72,78,84],{"id":31,"title":32,"uri":33,"author":9,"created_at":34,"view_count":35},28,"docker容器目录与主机目录同步","\u002Farticle\u002Fdocker容器目录与主机目录同步","2014-12-31 12:34:08",15570,{"id":37,"title":38,"uri":39,"author":9,"created_at":40,"view_count":41},21,"beego中使用fis","\u002Farticle\u002Fbeego中使用fis","2014-12-03 10:47:56",9250,{"id":43,"title":44,"uri":45,"author":9,"created_at":46,"view_count":47},20,"用github登录，oauth开发","\u002Farticle\u002F用github登录，oauth开发","2014-11-23 13:33:37",9113,{"id":49,"title":50,"uri":51,"author":9,"created_at":52,"view_count":53},18,"windows服务注册工具nssm","\u002Farticle\u002Fwindows服务注册工具nssm","2014-10-31 21:34:39",9047,{"id":55,"title":56,"uri":57,"author":9,"created_at":58,"view_count":59},49,"用latex排版中文书籍","\u002Farticle\u002F用latex排版中文书籍","2016-10-31 11:12:02",8634,{"id":61,"title":62,"uri":63,"author":9,"created_at":64,"view_count":65},19,"texlive中文书签乱码","\u002Farticle\u002Ftexlive中文书签乱码","2014-11-15 02:54:01",8461,{"id":67,"title":68,"uri":69,"author":9,"created_at":70,"view_count":71},6,"Windows上的软件包管理器chocolatey","\u002Farticle\u002FWindows上的软件包管理器chocolatey","2014-08-10 15:55:22",8009,{"id":73,"title":74,"uri":75,"author":9,"created_at":76,"view_count":77},3,"利用开源和免费资源搭建CI环境","\u002Farticle\u002F利用开源和免费资源搭建CI环境","2014-07-04 16:54:58",7732,{"id":79,"title":80,"uri":81,"author":9,"created_at":82,"view_count":83},16,"php-fpm网站目录权限配置","\u002Farticle\u002Fphp-fpm网站目录权限配置","2014-10-18 01:36:10",7274,{"id":85,"title":86,"uri":87,"author":9,"created_at":88,"view_count":89},27,"sublime text 2插件开发，外部修改文件无法重新加载","\u002Farticle\u002Fsublime text 2插件开发，外部修改文件无法重新加载","2014-12-26 20:24:13",7054,{"title":91,"list":92},"按月归档",[93,97,100,103,106,109,112,116,120,123,126,129,133,136,139,143,146,149,152,156,159,162,165,168,171,174,177,180,183,186,189,192,195,198,201,204,207,210,213,216,220,223,226,229,232,235],{"title":94,"uri":95,"view_count":96},"2026年7月","\u002Farchive\u002F2026\u002F7\u002F1","[1]",{"title":98,"uri":99,"view_count":96},"2026年1月","\u002Farchive\u002F2026\u002F1\u002F1",{"title":101,"uri":102,"view_count":96},"2025年4月","\u002Farchive\u002F2025\u002F4\u002F1",{"title":104,"uri":105,"view_count":96},"2024年6月","\u002Farchive\u002F2024\u002F6\u002F1",{"title":107,"uri":108,"view_count":96},"2024年5月","\u002Farchive\u002F2024\u002F5\u002F1",{"title":110,"uri":111,"view_count":96},"2024年4月","\u002Farchive\u002F2024\u002F4\u002F1",{"title":113,"uri":114,"view_count":115},"2023年12月","\u002Farchive\u002F2023\u002F12\u002F1","[6]",{"title":117,"uri":118,"view_count":119},"2023年11月","\u002Farchive\u002F2023\u002F11\u002F1","[2]",{"title":121,"uri":122,"view_count":96},"2023年10月","\u002Farchive\u002F2023\u002F10\u002F1",{"title":124,"uri":125,"view_count":96},"2023年7月","\u002Farchive\u002F2023\u002F7\u002F1",{"title":127,"uri":128,"view_count":119},"2023年6月","\u002Farchive\u002F2023\u002F6\u002F1",{"title":130,"uri":131,"view_count":132},"2023年5月","\u002Farchive\u002F2023\u002F5\u002F1","[3]",{"title":134,"uri":135,"view_count":119},"2023年4月","\u002Farchive\u002F2023\u002F4\u002F1",{"title":137,"uri":138,"view_count":119},"2023年3月","\u002Farchive\u002F2023\u002F3\u002F1",{"title":140,"uri":141,"view_count":142},"2023年2月","\u002Farchive\u002F2023\u002F2\u002F1","[5]",{"title":144,"uri":145,"view_count":96},"2023年1月","\u002Farchive\u002F2023\u002F1\u002F1",{"title":147,"uri":148,"view_count":119},"2022年12月","\u002Farchive\u002F2022\u002F12\u002F1",{"title":150,"uri":151,"view_count":142},"2022年11月","\u002Farchive\u002F2022\u002F11\u002F1",{"title":153,"uri":154,"view_count":155},"2022年10月","\u002Farchive\u002F2022\u002F10\u002F1","[4]",{"title":157,"uri":158,"view_count":115},"2022年9月","\u002Farchive\u002F2022\u002F9\u002F1",{"title":160,"uri":161,"view_count":142},"2022年8月","\u002Farchive\u002F2022\u002F8\u002F1",{"title":163,"uri":164,"view_count":96},"2019年7月","\u002Farchive\u002F2019\u002F7\u002F1",{"title":166,"uri":167,"view_count":96},"2019年2月","\u002Farchive\u002F2019\u002F2\u002F1",{"title":169,"uri":170,"view_count":96},"2018年9月","\u002Farchive\u002F2018\u002F9\u002F1",{"title":172,"uri":173,"view_count":96},"2018年8月","\u002Farchive\u002F2018\u002F8\u002F1",{"title":175,"uri":176,"view_count":96},"2017年11月","\u002Farchive\u002F2017\u002F11\u002F1",{"title":178,"uri":179,"view_count":96},"2017年8月","\u002Farchive\u002F2017\u002F8\u002F1",{"title":181,"uri":182,"view_count":96},"2017年5月","\u002Farchive\u002F2017\u002F5\u002F1",{"title":184,"uri":185,"view_count":96},"2017年4月","\u002Farchive\u002F2017\u002F4\u002F1",{"title":187,"uri":188,"view_count":96},"2016年11月","\u002Farchive\u002F2016\u002F11\u002F1",{"title":190,"uri":191,"view_count":96},"2016年10月","\u002Farchive\u002F2016\u002F10\u002F1",{"title":193,"uri":194,"view_count":119},"2016年9月","\u002Farchive\u002F2016\u002F9\u002F1",{"title":196,"uri":197,"view_count":96},"2016年8月","\u002Farchive\u002F2016\u002F8\u002F1",{"title":199,"uri":200,"view_count":119},"2016年7月","\u002Farchive\u002F2016\u002F7\u002F1",{"title":202,"uri":203,"view_count":142},"2016年6月","\u002Farchive\u002F2016\u002F6\u002F1",{"title":205,"uri":206,"view_count":96},"2015年12月","\u002Farchive\u002F2015\u002F12\u002F1",{"title":208,"uri":209,"view_count":96},"2015年10月","\u002Farchive\u002F2015\u002F10\u002F1",{"title":211,"uri":212,"view_count":119},"2015年2月","\u002Farchive\u002F2015\u002F2\u002F1",{"title":214,"uri":215,"view_count":96},"2015年1月","\u002Farchive\u002F2015\u002F1\u002F1",{"title":217,"uri":218,"view_count":219},"2014年12月","\u002Farchive\u002F2014\u002F12\u002F1","[8]",{"title":221,"uri":222,"view_count":119},"2014年11月","\u002Farchive\u002F2014\u002F11\u002F1",{"title":224,"uri":225,"view_count":142},"2014年10月","\u002Farchive\u002F2014\u002F10\u002F1",{"title":227,"uri":228,"view_count":132},"2014年9月","\u002Farchive\u002F2014\u002F9\u002F1",{"title":230,"uri":231,"view_count":132},"2014年8月","\u002Farchive\u002F2014\u002F8\u002F1",{"title":233,"uri":234,"view_count":132},"2014年7月","\u002Farchive\u002F2014\u002F7\u002F1",{"title":236,"uri":237,"view_count":119},"2013年9月","\u002Farchive\u002F2013\u002F9\u002F1",2,{"url":240,"title":241},"https:\u002F\u002Fimage.duguying.net\u002F2022\u002F09\u002Fij6x8o4s.webp","老家 摄于2020年秋",1790062262785]