18 Jun 2015

Linux 守护进程的实现

Look at the past for inspiration, but focus on the future, because tomorrow is shaped by the choices we make today.

昨天突然地来了场面试,让我有点不知所措,好在好多好多天前复习了下,但是自感表现不是很好(面试官的声音比较柔和,更是让我不知所措)。询问了做过的项目后,看我简历上有写 Linux 进程相关的经历,就开始追问了,从 IPC 到 Redis 再到 Nginx 模块开发、网络编程,还问了下 Golang(老实讲,Go 初学,只照着官网文档看了一遍,几天后忘得差不多了),最后问了个问题,让我遗憾了好多天,就是本文的题目:如何实现守护进程?

本来这个应该知道的,前面看过 Nginx 和 Redis 基础架构,都是以 Daemon 的方式运行的。但是当时没查词典 “Daemon” 是什么意思,然而又感觉这个名词好像在哪里见过,结果便懵了,只能说不知道“守护进程”这个东西……归根到底还是因为没有相关服务端开发经验惹的祸。这不禁让我记起当年老大问我“SQL绑定变量”的原因是什么,只记得当时脸红过关羽;哎,只知道这样用,却不知这个东西叫啥……

那么守护进程到底是做什么的呢?该如何实现呢?经过一番深刻地反省和检讨之后,博主认真学习怎么去实现守护进程。

守护进程 Daemon

守护进程,也即通常所说的 Daemon 进程,是 Linux 下一种特殊的后台服务进程,它独立于控制终端并且周期性的执行某种任务或者等待处理某些发生的事件。守护进程通常在系统引导装入时启动,在系统关闭时终止。Linux 系统下大多数服务都是通过守护进程实现的。

守护进程的名称通常以 “d” 结尾,如 “httpd”、“crond”、“mysqld”等。

控制终端是什么?
终端是用户与操作系统进行交流的界面。在 Linux 系统中,用户由终端登录系统登入系统后会得到一个 shell 进程,这个终端便成为这个 shell 进程的控制终端(Controlling Terminal)。shell 进程启动的其他进程,由于复制了父进程的信息,因此也都同依附于这个控制终端。
从终端启动的进程都依附于该终端,并受终端控制和影响。终端关闭,相应的进程都会自动关闭。守护进程脱离终端的目的,也即是不受终端变化的影响不被终端打断,当然也不想在终端显示执行过程中的信息。

13 May 2015

Bash 学习笔记

bash 多行注释

单行注释,井号 # 可以搞定,下面说多行的:通过 Here Documents 实现。

:<<EOF
注释的代码...
EOF

冒号 : 是空命令,表示什么都不做,亦即相当于注释了。
“EOF” 为 Here Documents 中的定义符号,名称任意,只要前后匹配就行。

Here Documents 的更多使用方法参考这里:http://tldp.org/LDP/abs/html/here-docs.html

说明: 这种方法当注释代码里出现变量引用或者是反引号时,bash 会去尝试解析他们,会提示错误信息,解决方法有下面几种:

06 May 2015

启用 Xfce 桌面的事件声音

  1. Enable “Event Sounds” in Settings Manager -> Appearance -> Settings
  2. Set “xsettings/Net/SoundThemeName” in the Settings Manager (to a sound theme located in /usr/share/sounds).
  3. Export GTK_MODULES=“canberra-gtk-module” (In Arch this was done automatically by install the libcanberra package, in Xubuntu and Fedora I had to manually create the file: see http://ubuntuforums.org/showthread.php?t=1869787&page=2&p=12008205&viewfull=1#post12008205)
  4. Install the following packages: Arch (libcanberra libcanberra-pulse) Xubuntu (sox gnome-session-canberra) Fedora (libcanberra)
  5. Turn up “System Sounds” in pavucontrol (Pulseaudio).
# /etc/X11/xinit/xinitrc.d/50-xinput.sh

if [ -z "$GTK_MODULES" ] ; then
    GTK_MODULES="canberra-gtk-module"
else
    GTK_MODULES="$GTK_MODULES:canberra-gtk-module"
fi
export GTK_MODULES

注销重新登录,声音就出现了。

05 May 2015

开源编辑器:Visual Studio Code

M$ 的 Visual Studio 家族新添一名支持 Linux 的成员,成为它家首个跨平台的代码编辑器。

Visual Studio Code 是一款面向云端应用开发的代码编辑器(轻量级 IDE ?),现阶段具备的功能有:

  • 具备家族标志性的代码补全功能
  • 突出文件导航定位的特点
  • 支持 Node.js 和 ASP.NET v5 应用开发
  • 具备 Node.js 调试功能,未来还将增添更多支持
  • 内置 Git 支持

官方首页及下载地址

Microsoft Launches Visual Studio Code, A Free Cross-Platform Code Editor For OS X, Linux And Windows

04 May 2015

学习 tar 压缩命令

linux解压 tar命令

tar [-cxtzjvfpPN] 文件与目录 ....

参数:

-c :建立一个压缩文件的参数指令(create 的意思);
-x :解开一个压缩文件的参数指令!
-t :查看 tarfile 里面的文件!
特别注意,在参数的下达中, c/x/t 仅能存在一个!不可同时存在!因为不可能同时压缩与解压缩。
-z :是否同时具有 gzip 的属性?亦即是否需要用 gzip 压缩?
-j :是否同时具有 bzip2 的属性?亦即是否需要用 bzip2 压缩?
-v :压缩的过程中显示文件!这个常用,但不建议用在背景执行过程!
-f :使用档名,请留意,在 f 之后要立即接档名喔!不要再加参数,例如使用『 tar -zcvfP tfile sfile』就是错误的写法,要写成 『 tar -zcvPf tfile sfile』才对喔!
-p :使用原文件的原来属性(属性不会依据使用者而变)
-P :可以使用绝对路径来压缩!
-N :比后面接的日期(yyyy/mm/dd)还要新的才会被打包进新建的文件中!
–exclude FILE:在压缩的过程中,不要将 FILE 打包!

29 Apr 2015

如何启用 root 用户登录 Fedora ?

以前的 Fedora 发行版默认无法 root 登录系统,需要在普通账户下修改配置文件。

在终端输入:

[test@fedora ~]$ su  
Password:   
[root@fedora test]# vim /etc/pam.d/gdm-password  

注释掉这段及前面加上#号,如下:

#auth        required      pam_succeed_if.so user != root quiet  

保存之后注销再用 root 和密码登陆就好了。

修改目录 /etc/pam.d/gdm 与 /etc/pam.d/gdm-password 两个文件

一般修改方法:

在终端中输入su 命令并输入root密码这样我在终端中就有了root的操权限接下来我们使用gdit命令对其进行修改

vim /etc/pam.d/gdm  

在这段 “auth required pamsucceedif.so user != root quiet” 加上 # 号注释掉就可以了

同样的 vim /etc/pam.d/gdm-password
也是在 auth required pamsucceedif.so user != root quiet 前面加上 # 号注释

保存之后我们重启或者注销一次计算机就能以 root 进行登录系统了

11 Mar 2015

十个基础算法及其讲解

Algorithms

算法一:快速排序算法

快速排序是由东尼·霍尔所发展的一种排序算法。
在平均状况下,排序 n 个项目要 Ο(nlogn) 次比较。在最坏状况下则需要 Ο(n^2) 次比较,但这种状况并不常见。事实上,快速排序通常明显比其他 Ο(nlogn) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。

快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。

QuickSort

算法步骤

  1. 从数列中挑出一个元素,称为 “基准”(pivot)。
  2. 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
  3. 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。