linux命令总结(供自己学习)

ps查看进程
ps -ef | more
以列表的方式查看,并分页
id 打印进程ID号
ping www.baidu.com 查看链接状态
echo $PATH 查看环静变量
valgrind 查看是否有内存泄漏
chmod 0777 文件 修改权限
ctrl+d 结束进程
alias -p cls="clear"//给命令定义别名
touch 有文件时刷新创建时间,无文件时创建文件
echo +文件
现实文件名字
$123="fdsfdsf"
终端中给变量赋值
echo #HOME 现实变量的值
echo 12345>>data.txt 往data.txt 追加内容
stat 1.TXT
查看文件信息
chmod u-x 1.txt
chmod u+x 1.txt
删除和增加权限
cd -
返回历史路径
判断链接文件用lstat
ps -aux 查看进程占的资源
chown root.root bin/jjj
改变用户和用户组
粘着位:
修改当前用户的有效用户
pstree打印进程树
ps -ef | grep process_link
查看process_link 相关的进程
kill -9 +进程号 杀死相应的进程
ps ax -o pid,ppid,command筛选出这几项
execlp("ps","ps -o pid,ppid.command",NULL);函数
ctrl+z
停止程序
fg恢复程序
vim 中 ctrl+n补全
ipcs用法
ipcs -a  是默认的输出信息 打印出当前系统中所有的进程间通信方式的信息
ipcs -m  打印出使用共享内存进行进程间通信的信息
ipcs -q   打印出使用消息队列进行进程间通信的信息
ipcs -s  打印出使用信号进行进程间通信的信息

输出格式的控制
ipcs -t   输出信息的详细变化时间


ipcs -p  输出ipc方式的进程ID
ipcs -c  输出ipc方式的创建者/拥有者


ipcs -c  输出ipc各种方式的在该系统下的限制条件信息


ipcs -u  输出当前系统下ipc各种方式的状态信息(共享内存,消息队列,信号)


ipcrm 命令
移除一个消息对象。或者共享内存段,或者一个信号集,同时会将与ipc对象相关链的数据也一起移除。当然,只有超级管理员,或者ipc对象的创建者才有这项权利啦

ipcrm用法
ipcrm -M shmkey  移除用shmkey创建的共享内存段
ipcrm -m shmid    移除用shmid标识的共享内存段
ipcrm -Q msgkey  移除用msqkey创建的消息队列
ipcrm -q msqid  移除用msqid标识的消息队列
ipcrm -S semkey  移除用semkey创建的信号
ipcrm -s semid  移除用semid标识的信号


echo

出自

linux的echo命令, 在shell编程中极为常用, 在终端下打印变量value的时候也是常常用到的, 因此有必要了解下echo的用法

echo命令的功能是在显示器上显示一段文字,一般起到一个提示的作用。
该命令的一般格式为: echo [ -n ] 字符串
其中选项n表示输出文字后不换行;字符串能加引号,也能不加引号。用echo命令输出加引号的字符串时,将字符串原样输出;用echo命令输出不加引号的字符串时,将字符串中的各个单词作为字符串输出,各字符串之间用一个空格分割。

功能说明:显示文字。
语   法:echo [-ne][字符串]或 echo [--help][--version]
补充说明:echo会将输入的字符串送往标准输出。输出的字符串间以空白字符隔开, 并在最后加上换行号。
参   数:-n 不要在最后自动换行
-e 若字符串中出现以下字符,则特别加以处理,而不会将它当成一般
文字输出:
   \a 发出警告声;
   \b 删除前一个字符;
   \c 最后不加上换行符号;
   \f 换行但光标仍旧停留在原来的位置;
   \n 换行且光标移至行首;
   \r 光标移至行首,但不换行;
   \t 插入tab;
   \v 与\f相同;
   \\ 插入\字符;
   \nnn 插入nnn(八进制)所代表的ASCII字符;
–help 显示帮助
–version 显示版本信息

 

 

ECHO命令是大家都熟悉的DOS批处理命令的一条子命令,但它的一些功能和用法也许你并不是全都知道,不信你瞧:

1. 作为控制批处理命令在执行时是否显示命令行自身的开关 格式:ECHO [ON|OFF] 如果想关闭“ECHO OFF”命令行自身的显示,则需要在该命令行前加上“@”。

2. 显示当前ECHO设置状态 格式:ECHO

3. 输出提示信息 格式:ECHO信息内容 上述是ECHO命令常见的三种用法,也是大家熟悉和会用的,但作为DOS命令淘金者你还应该知道下面的技巧:

4. 关闭DOS命令提示符 在DOS提示符状态下键入ECHO OFF,能够关闭DOS提示符的显示使屏幕只留下光标,直至键入ECHO ON,提示符才会重新出现。

5. 输出空行,即相当于输入一个回车 格式:ECHO. 值得注意的是命令行中的“.”要紧跟在ECHO后面中间不能有空格,否则“.”将被当作提示信息输出到屏幕。另外“.”可以用,:;”/[/]+等任一符号替代。 在下面的例子中ECHO.输出的回车,经DOS管道转向作为TIME命令的输入,即相当于在TIME命令执行后给出一个回车。所以执行时系统会在显示当前时间后,自动返回到DOS提示符状态: C:〉ECHO.|TIME ECHO命令输出空行的另一个应用实例是:将ECHO.加在自动批处理文件中,使原本在屏幕下方显示的提示画面,出现在屏幕上方。

6. 答复命令中的提问 格式:ECHO答复语|命令文件名 上述格式可以用于简化一些需要人机对话的命令(如:CHKDSK/F;FORMAT Drive:;del *.*)的操作,它是通过DOS管道命令把ECHO命令输出的预置答复语作为人机对话命令的输入。下面的例子就相当于在调用的命令出现人机对话时输入“Y”回车: C:〉ECHO Y|CHKDSK/F C:〉ECHO Y|DEL A :*.*

7. 建立新文件或增加文件内容 格式:ECHO 文件内容>文件名 ECHO 文件内容>>文件名 例如:C:〉ECHO @ECHO OFF〉AUTOEXEC.BAT建立自动批处理文件 C:〉ECHO C:/CPAV/BOOTSAFE〉〉AUTOEXEC.BAT向自动批处理文件中追加内容 C:TYPE AUTOEXEC.BAT显示该自动批处理文件 @ECHO OFF C:/CPAV/BOOTSAFE

8. 向打印机输出打印内容或打印控制码 格式:ECHO 打印机控制码>PRN ECHO 打印内容>PRN 下面的例子是向M-1724打印机输入打印控制码。<Alt>156是按住Alt键在小键盘键入156,类似情况依此类推: C:〉ECHO 〈Alt〉+156〈Alt〉+42〈Alt〉+116〉PRN(输入下划线命令FS*t) C:〉ECHO 〈Alt〉+155@〉PRN(输入初始化命令ESC@) C:〉ECHO.〉PRN(换行)

9. 使喇叭鸣响 C:〉ECHO ^G “^G”是用Ctrl+G或Alt+007输入,输入多个^G可以产生多声鸣响。使用方法是直接将其加入批处理文件中或做成批处理文件调用。

10.执行ESC控制序列修改屏幕和键盘设置 我们知道DOS的设备驱动程序ANSI.SYS提供了一套用来修改屏幕和键盘设置的ESC控制序列。如执行下述内容的批处理程序可以把功能键F12定义为DOS命令“DIR/W”,并把屏幕颜色修改为白色字符蓝色背景。 @ECHO”←[0;134;”DIR/W”;13p @ECHO”←[1;37;44m (注:批处理文件中“←”字符的输入方法是在编辑状态下按Alt中小键盘上的27) DOS命令是接触计算机的人首先要学到的,对许多人来说是太熟悉太简单了,其实不然,在这些命令中蕴藏着丰富的内容,仍有待于我们进一步去理解去开发,如果你是一个有心人就一定会从这些自以为熟知的命令中发现新的闪光点,淘得真金。


linux的echo命令, 在shell编程中极为常用, 在终端下打印变量value的时候也是常常用到的, 因此有必要了解下echo的用法

echo命令的功能是在显示器上显示一段文字,一般起到一个提示的作用。
该命令的一般格式为: echo [ -n ] 字符串
其中选项n表示输出文字后不换行;字符串能加引号,也能不加引号。用echo命令输出加引号的字符串时,将字符串原样输出;用echo命令输出不加引号的字符串时,将字符串中的各个单词作为字符串输出,各字符串之间用一个空格分割。

功能说明:显示文字。
语   法:echo [-ne][字符串]或 echo [--help][--version]
补充说明:echo会将输入的字符串送往标准输出。输出的字符串间以空白字符隔开, 并在最后加上换行号。
参   数:-n 不要在最后自动换行
-e 若字符串中出现以下字符,则特别加以处理,而不会将它当成一般
文字输出:
   \a 发出警告声;
   \b 删除前一个字符;
   \c 最后不加上换行符号;
   \f 换行但光标仍旧停留在原来的位置;
   \n 换行且光标移至行首;
   \r 光标移至行首,但不换行;
   \t 插入tab;
   \v 与\f相同;
   \\ 插入\字符;
   \nnn 插入nnn(八进制)所代表的ASCII字符;
–help 显示帮助
–version 显示版本信息

 
 原文地址 http://hi.baidu.com/zgyz/blog/item/272061edd07a7fd3b31cb1c3.html 

 

echo命令行 承接上一章所介绍的command line ,这里我们用echo这个命令加以进一步说明。
标准的command line包含三个部件:
    *command-name options argument
 
echo是一个非常简单、直接的linux命令:
    *将argument送出至标准输出(STDOUT),通常就是在显示器(monitor)上输出。
 
为了更好的理解,不如先让我们跑一下 echo 命令好了:
 
$ echo

$

你会发现只有一个空白行,然后又回到 shell prompt 上了。这是因为 echo 在预设上,在显示完argument之后,还会送出一个换行符号(new-line charactor)。上面的命令没有任何的argument,结果就只剩下一个换行符号了。若要取消这个换行符号,可以利用echo的 -n option
 
$ echo -n
$
 
不妨让我们回到 command line 的概念上来讨论上例的 echo 命令好了:
    command line 只有 command-name(echo)以及option(-n),并没有任何argument。要想看看 echo的argument ,那还不简单!接下来,可以试试如下的输入:

$ echo first line
first line
$ echo -n first line
first line $
 
在上两个 echo 命令中,你会发现 argument 的部分显示在你的屏幕,而换行符号则视 -n option的有无而别。很明显的,第二个echo由于换行符号被取消了,接下来的shell prompt就接在输出结果同一行了。

事实上,echo除了 -n options 之外,常用选项还有:
    -e:启用反斜线控制字符的转换
    -E:关闭反斜线控制字符的转换(预设如此)
    -n:取消行末之换行符号(与 -e 选项下的 \c 字符同意)
 
關於 echo 命令所支援的反斜線控制字符如下表:
        \a:ALERT / BELL (从系统喇叭发送出声音)
        \b:BACKSPACE ,也就是向左刪除
        \c:取消行末的行换符号
        \E:ESCAPE,逃离键
        \f:FORMFEED,换页字符
        \n:NEWLINE,換行字符
        \r:RETURN,回车键
        \t:TAB,表格跳位鍵
        \v:VERTICAL TAB,垂直表格跳位鍵
        \n:ASCII 八进制编码(以 x 为十六进制)
        \\:反斜线本身
       

或许,我们可以透过实例来了解 echo 的选项及控制字符:

例一:
$ echo -e "a\tb\tc\nd\te\tf"
a       b       c
d       e       f
 
上例运用 \t 来区隔 abc 还有 def ,以及用 \n 将 def 换至下一行。

例二:
$ echo -e "\141\011\142\011\143\012\144\011\145\011\146"
a       b       c
d       e       f

与例一的结果一样,只是使用了八进制编码来表示。

例三:
$ echo -e "\x61\x09\x62\x09\x63\x0a\x64\x09\x65\x09\x66"
a       b       c
d       e       f
 
与例二差不多,只是换用了十六进制编码。


例四:
$ echo -ne "a\tb\tc\nd\te\bf\a"
a       b       c
d       f $
 
因为 e 字母后面是删除键(\b),因此输入结果就没有e了。
在结束时听到一声铃响,那是\a的杰作!
由于同时使用了 -n 选项,因此 shell prompt 紧接在第二行之后。
若不用 -n 的话,那在\a后再加个\c,也是同样的效果。
 
事实上,在日后的 shell 操作及 shell script 设计上,echo 命令是最常用的命令之一。
比方说,用 echo 来检查变量值:
$ A=B
$ echo $A
B
$ echo $?
0

 

解释

echo 命令:
     echo 命令用来在标准输出中显示输入的字符串。

语法:
  语法是 
     echo [命令开关..] [字符串]

命令开关:
     
-n不输出结尾的换行符
-e能够解释下面列出的反斜杠转义字符
-E不能够解释那些字符串序列

    不使用参数-E,下面的序列是可以辨识的和可以以内插只替换的:

\NNN输出ASCII代码是NNN(八进制的)的字符
\a发出报警(响铃)
\\反斜杠符号
\b退格键
\c不添加末尾换行符
\fform feed换行 光标仍然停留在原来的位置
\n换行符
\r回车符
\t插入tab键,水平制表符
\v垂直制表符


示例:
     
  1. echo 命令 
    echo "hscripts Hiox India"

    上述命令显示的结果为 hscripts Hiox India

  2. 使用退格键:
    echo -e "hscripts \bHiox \bIndia"

    上述命令将删除空格,显示结果为hscriptsHioxIndia

  3. d使用echo命令输出tab空格标签
     echo -e "hscripts\tHiox\tIndia"
    上述命令将输出如下结果 hscripts          Hiox          India



变量的取用就如上面的范例,利用 ehco 就能够读出,叧是需要在发量名称前面加上 $ , 或者是以
${变量} 的方式用都可以!当然啦,那个 echo 的功能可是很多的, 我们这里单纯是拿 echo 来读
出发量的内容而已,更多癿的echo 使用,请自行给他 man echo 吧! ^_^

例题:
请在屏幕上面显示出您的环境发量 HOME 不 MAIL:
答:
echo $HOME 或者是 echo ${HOME}
echo $MAIL 或者是 echo ${MAIL}


每个 Linux 都能够拥有多个核心版本,且几乎 distribution 的核心版本都不相同。以 CentOS 5.3 (未更
新前) 为例,他的预设核心版本是 2.6.18-128.el5 ,所以核心模块目录在 /lib/modules/2.6.18-
128.el5/kernel/ 内。 也由亍每个 distributions 的这个值都不相同,但是我们却可以利用 uname -r 这
个指令先取得版本信息。所以啰,就可以透过上面指令当中的内含指令 `uname -r` 先取得版本输出到
cd ... 那个指令当中,就能够顺的进入目前核心的驱动程序所放置的目录啰!很方便吧!

例题:
在发量的设定当中,单引号与双引号的用途有何不同?
答:
单引号与双引号的最大不同在于双引号仍然可以保有发量的内容,但单引号内仅能是一般字
符 ,而不会有特殊符号。我们以底下的例子做说明:假设您定义了一个发量,
name=VBird ,现在想以 name 这个发量的内容定义出 myname 显示 VBird its me 这个
内容,要如何订定呢?
[root@www ~]# name=VBird
[root@www ~]# echo $name
VBird
[root@www ~]# myname="$name its me"
[root@www ~]# echo $myname
VBird its me
[root@www ~]# myname='$name its me'
[root@www ~]# echo $myname
$name its me
发现了吗?没错!使用了单引号的时候,那么 $name 将失去原有的发量内容,仅为一般字
符的显示型态而已!这里必需要特删小心在意!

例题:
在指令下达的过程中,反单引号( ` )这个符号代表的意义为何?
答:
在一串指令中,在 ` 之内的指令将会被先执行,而其执行出来的结果将做为外部的输入信
息!例如 uname -r 会显示出目前的核心版本,而我们的核心版本在 /lib/modules 里面,
因此,你可以先执行 uname -r 找出核心版本,然后再以『 cd 目录』到该目录下,当然也
可以执行如同上面范例六的执行内容啰。
另外再举个例子,我们也知道, locate 指令可以列出所有的相关档案档名,但是,如果我
想要知道各个档案的权限呢?举例来说,我想要知道每个 crontab 相关档名的权限:
[root@www ~]# ls -l `locate crontab`
如此一来,先以 locate 将文件名数据都列出来,再以 ls 指令来处理的意思啦!瞭了吗?

例题:
若你有一个常去的工作目录名称为:『/cluster/server/work/taiwan_2005/003/』,如何
迚行该目录的简化?
答:
在一般的情况下,如果你想要迚入上述的目录得要『cd
/cluster/server/work/taiwan_2005/003/』, 以鸟哥自己癿案例来说,鸟哥跑数值模式常
常会设定很长的目录名称(避免忘记),但如此一来变换目录就很麻烦。 此时,鸟哥习惯利用
底下的方式来降低指令下达错误的问题:
[root@www ~]# work="/cluster/server/work/taiwan_2005/003/"
[root@www ~]# cd $work
未来我想要使用其他目录作为我的模式工作目录时,叧要发更 work 这个变数即可!而这个
变量又可以在 bash 的配置文件中直接指定,那我每次登入叧要执行『 cd $work 』就能够
去到数值模式仿真的工作目录了!是否很方便呢? ^_^



echo是一种最常用的与广泛使用的内置于Linux的bash和C shell的命令,通常用在脚本语言和批处理文件中来在标准输出或者文件中显示一行文本或者字符串。

echo命令的语法是:

  1. echo [选项][字符串]
1. 输入一行文本并显示在标准输出上
  1. $ echo Tecmintis a community of LinuxNerds

会输出下面的文本:

  1. Tecmintis a community of LinuxNerds
2. 输出一个声明的变量值

比如,声明变量x并给它赋值为10

  1. $ x=10

会输出它的值:

  1. $ echo The value of variable x = $x
  2.  
  3. The value of variable x =10
3. 使用‘\b‘选项

-e‘后带上'\b'会删除字符间的所有空格。

注意: Linux中的选项‘-e‘扮演了转义字符反斜线的翻译器。

  1. $ echo -"Tecmint \bis \ba \bcommunity \bof \bLinux \bNerds"
  2.  
  3. TecmintisacommunityofLinuxNerds
4. 使用‘\n‘选项

-e‘后面的带上‘\n’行会在遇到的地方作为新的一行

  1. $ echo -"Tecmint \nis \na \ncommunity \nof \nLinux \nNerds"
  2.  
  3. Tecmint
  4. is
  5. a
  6. community
  7. of
  8. Linux
  9. Nerds
5. 使用‘\t‘选项

-e‘后面跟上‘\t’会在空格间加上水平制表符。

  1. $ echo -"Tecmint \tis \ta \tcommunity \tof \tLinux \tNerds"
  2.  
  3. Tecmintis a community of LinuxNerds
6. 也可以同时使用换行‘\n‘与水平制表符‘\t
  1. $ echo -"\n\tTecmint \n\tis \n\ta \n\tcommunity \n\tof \n\tLinux \n\tNerds"
  2.  
  3. Tecmint
  4. is
  5. a
  6. community
  7. of
  8. Linux
  9. Nerds
7. 使用‘\v‘选项

-e‘后面跟上‘\v’会加上垂直制表符。

  1. $ echo -"\vTecmint \vis \va \vcommunity \vof \vLinux \vNerds"
  2.  
  3. Tecmint
  4. is
  5. a
  6. community
  7. of
  8. Linux
  9. Nerds
8. 也可以同时使用换行‘\n‘与垂直制表符‘\v
  1. $ echo -"\n\vTecmint \n\vis \n\va \n\vcommunity \n\vof \n\vLinux \n\vNerds"
  2.  
  3.  
  4. Tecmint
  5.  
  6. is
  7.  
  8. a
  9.  
  10. community
  11.  
  12. of
  13.  
  14. Linux
  15.  
  16. Nerds

注意: 你可以按照你的需求连续使用两个或者多个垂直制表符,水平制表符与换行符。

9. 使用‘\r‘选项

-e‘后面跟上‘\r’来指定输出中的回车符。(LCTT 译注:会覆写行开头的字符)

  1. $ echo -"Tecmint \ris a community of Linux Nerds"
  2.  
  3. is a community of LinuxNerds
10. 使用‘\c‘选项

-e‘后面跟上‘\c’会抑制输出后面的字符并且最后不会换新行。

  1. $ echo -"Tecmint is a community \cof Linux Nerds"
  2.  
  3. Tecmintis a community @tecmint:~$
11. ‘-n‘会在echo完后不会输出新行
  1. $ echo -"Tecmint is a community of Linux Nerds"
  2. Tecmintis a community of LinuxNerds@tecmint:~/Documents$
12. 使用‘\a‘选项

-e‘后面跟上‘\a’选项会听到声音警告。

  1. $ echo -"Tecmint is a community of \aLinux Nerds"
  2. Tecmintis a community of LinuxNerds

注意: 在你开始前,请先检查你的音量设置。

13. 使用echo命令打印所有的文件和文件夹(ls命令的替代)
  1. $ echo *
  2.  
  3. 103.odt103.pdf104.odt104.pdf105.odt105.pdf106.odt106.pdf107.odt107.pdf108a.odt 108.odt108.pdf109.odt109.pdf110b.odt 110.odt110.pdf111.odt111.pdf112.odt112.pdf113.odt linux-headers-3.16.0-customkernel_1_amd64.deb linux-image-3.16.0-customkernel_1_amd64.deb network.jpeg
14. 打印制定的文件类型

比如,让我们假设你想要打印所有的‘.jpeg‘文件,使用下面的命令。

  1. $ echo *.jpeg
  2.  
  3. network.jpeg
15. echo可以使用重定向符来输出到一个文件而不是标准输出
  1. $ echo "Test Page"> testpage
  2.  
  3. ## Check Content
  4. avi@tecmint:~$ cat testpage
  5. TestPage
echo 选项列表
选项 描述
-n 不输出末尾的换行符。
-e 启用反斜线转义。
\b 退格
\\ 反斜线
\n 新行
\r 回车
\t 水平制表符
\v 垂直制表符

就是这些了,不要忘记在下面留下你的反馈。

echo命令实例 http://www.linuxidc.com/Linux/2014-08/105548.htm

shell 下使用 echo 打印彩色字体及彩色背景 http://www.linuxidc.com/Linux/2014-07/104776.htm

Linux命令之终端打印 - echo http://www.linuxidc.com/Linux/2014-04/99571.htm

本文永久更新链接地址http://www.linuxidc.com/Linux/2014-10/107550.htm


后台进程

后台启动

默认情况下,进程是在前台运行的,这时就把shell给占据了,我们无法进行其它操作。对于那些没有交互的进程,很多时候,我们希望将其在后台启动,可以在启动参数的时候加一个'&'实现这个目的。

    tianfang > run &
    [1] 11319
    tianfang >

进程切换到后台的时候,我们把它称为job。切换到后台时会输出相关job信息,以前面的输出为[1] 11319例:[1]表示job ID是1,11319表示进程ID是11319。

切换到后台的进程,仍然可以用ps命令查看:

    tianfang > ps
     PID TTY TIME CMD
     5170 pts/3 00:00:00 bash
    11319 pts/3 00:00:00 run
    11320 pts/3 00:00:00 ps
    tianfang >

可以通过jobs命令只查看所有job(后台进程):

    tianfang > jobs
    [1]+ Done run
    tianfang >

前后台间切换

可以通过bg <jobid>(background)和fg<jobid>(foreground)命令将其在前后台间状态切换。例如,对于一个前台执行的进程,可以通过Ctrl+Z命令将其切换到后台,但此时是进程被挂起了:

    tianfang > run
    ^Z
    [1]+ Stopped run

此时通过bg就可以让其继续执行:

    tianfang > bg 1
    [1]+ run &
    tianfang >

在后台执行后,又可以通过fg命令将其切换回前台:

    tianfang > fg 1
    run
    ^C
    tianfang >

Shell退出后进程继续执行

当Shell退出后,该Shell下运行的job会收到SIGHUB信号,进而使其退出。然而,很多时候,我们不想让其长期运行,不想受到Shell退出的影响。一种方式就是通过disown -h <psID>命令,让特定job忽略SIGHUB信号

    tianfang > run &
    [1] 24582
    tianfang > disown -h 24582
    tianfang >

由于需要动态的进程号作为参数,要用脚本运行的话,则可以通过%1来获取这个进程号:

    tianfang > run &
    [1] 25659
    tianfang > disown -h %1
    tianfang >

退出Shell的继续执行的方法不知这一种,文章让进程在后台可靠运行中就介绍了几种常用的方法,我就喜欢其中所说的带括号的启动方式。

    tianfang > (run &)
    tianfang >

守护进程

如果一个进程永远都是以后台方式启动,并且不能受到Shell退出影响而退出,一个正统的做法是将其创建为守护进程。守护进程值得是系统长期运行的后台进程,类似Windows服务。守护进程信息通过ps –a无法查看到,需要用到–x参数,当使用这条命令的时候,往往还附上-j参数以查看作业控制信息,其中TPGID一栏为-1就是守护进程。

    tianfang > ps xj
     PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
     953 1190 1190 1190 ? -1 Ss 1000 0:00 /bin/sh /usr/bin/startkde
     1 1490 1482 1482 ? -1 Sl 1000 0:00 /usr/bin/VBoxClient –seamless
     1 1491 1477 1477 ? -1 Sl 1000 0:00 /usr/bin/VBoxClient –display

创建守护进程最关键的一步是调用setsid函数创建一个新的Session,并成为Session Leader。成功调用该函数的结果是:

  • 创建一个新的Session,当前进程成为Session Leader,当前进程的id就是Session的id
  • 创建一个新的进程组,当前进程成为进程组的Leader,当前进程的id就是进程组的id
  • 如果当前进程原本有一个控制终端,则它失去这个控制终端,成为一个没有控制终端的进程。

一个示例如下:

    #include <stdlib.h>
    #include <stdio.h>
    #include <fcntl.h>

    void daemonize(void)
    {
        pid_t pid;

        /*
         * Become a session leader to lose controlling TTY.
         */
        if ((pid = fork()) < 0) {
            perror("fork");
            exit(1);
        } else if (pid != 0) /* parent */
            exit(0);
        setsid();

        /*
         * Change the current working directory to the root.
         */
        if (chdir("/") < 0) {
            perror("chdir");
            exit(1);
        } 

        /*
         * Attach file descriptors 0, 1, and 2 to /dev/null.
         */
        close(0);
        open("/dev/null", O_RDWR);
        dup2(0, 1);
        dup2(0, 2);
    }

    int main(void)
    {
        daemonize();
        while(1)
            sleep(1);
    }

为了确保调用setsid的进程不是进程组的Leader,首先fork出一个子进程,父进程退出,然后子进程调用setsid创建新的Session,成为守护进程。

按照守护进程的惯例,通常将当前工作目录切换到根目录,将文件描述符0、1、2重定向到/dev/null。Linux也提供了一个库函数daemon(3)实现我们的daemonize函数的功能,它带两个参数指示要不要切换工作目录到根目录,以及要不要把文件描述符0、1、2重定向到/dev/null。

    tianfang > run
    tianfang > ps xj | grep run
        1 2665 1868 1868 ? -1 Sl 1000 0:05 kdeinit4: krunner [kdeinit] 
        1 27506 27506 27506 ? -1 Ss 1000 0:00 run
    25662 27508 27507 25662 pts/2 27507 S+ 1000 0:00 grep --color=auto run
    tianfang >

运行这个程序,它变成一个守护进程,不再和当前终端关联。用ps命令看不到,必须运行带x参数的ps命令才能看到。另外还可以看到,用户关闭终端窗口或注销也不会影响守护进程的运行。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值