总结一下shell的&、&&、||
& 用法
& 放在启动参数后面表示设置此进程为后台进程,默认情况下,进程是前台进程,这时就把Shell给占据了,我们无法进行其他操作,对于那些没有交互的进程,很多时候,我们希望将其在后台启动,可以在启动参数的时候加一个’&‘实现这个目的。
如:
[root@xiexianbin_cn ~]# run &
[1] 18502
[root@xiexianbin_cn ~]#
进程切换到后台的时候,我们把它称为job。切换到后台时会输出相关job信息,以前面的输出为[1] 18502:[1]表示job ID是1,18502表示进程ID是18502。切换到后台的进程,仍然可以用ps命令查看。
1. 前后台间切换
可以通过bg (background)和fg(foreground)命令将其在前后台间状态切换。
2. 守护进程
如果一个进程永远都是以后台方式启动,并且不能受到Shell退出影响而退出,一个正统的做法是将其创建为守护进程。守护进程值得是系统长期运行的后台进程,类似Windows服务。守护进程信息通过ps –a无法查看到,需要用到–x参数,当使用这条命令的时候,往往还附上-j参数以查看作业控制信息,其中TPGID一栏为-1就是守护进程。
[root@xiexianbin_cn xin]# ps xj
PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
0 1 1 1 ? -1 Ss 0 0:00 /sbin/init
0 2 0 0 ? -1 S 0 0:00 [kthreadd]
2 3 0 0 ? -1 S 0 0:00 [ksoftirqd/0]
2 5 0 0 ? -1 S< 0 0:00 [kworker/0:0H]
2 6 0 0 ? -1 S 0 0:01 [kworker/u30:0]
2 7 0 0 ? -1 S 0 0:00 [migration/0]
2 8 0 0 ? -1 S 0 0:00 [rcu_bh]
2 9 0 0 ? -1 S 0 0:00 [rcuob/0]
2 10 0 0 ? -1 S 0 0:00 [rcuob/1]
2 11 0 0 ? -1 S 0 0:00 [rcuob/2]
2 12 0 0 ? -1 S 0 0:00 [rcuob/3]
2 13 0 0 ? -1 S 0 0:00 [rcuob/4]
2 14 0 0 ? -1 S 0 0:00 [rcuob/5]
2 15 0 0 ? -1 S 0 0:00 [rcuob/6]
2 16 0 0 ? -1 S 0 0:00 [rcuob/7]
2 17 0 0 ? -1 S 0 0:00 [rcuob/8]
2 18 0 0 ? -1 S 0 0:00 [rcuob/9]
创建守护进程最关键的一步是调用setsid函数创建一个新的Session,并成为Session Leader。成功调用该函数的结果是:
创建一个新的Session,当前进程成为Session Leader,当前进程的id就是Session的id
创建一个新的进程组,当前进程成为进程组的Leader,当前进程的id就是进程组的id
如果当前进程原本有一个控制终端,则它失去这个控制终端,成为一个没有控制终端的进程。
&& 用法
shell 在执行某个命令的时候,会返回一个返回值,该返回值保存在 shell 变量 $? 中。当 $? == 0 时,表示执行成功;当 $? == 1 时(我认为是非0的数,返回值在0-255间),表示执行失败。
有时候,下一条命令依赖前一条命令是否执行成功。如:在成功地执行一条命令之后再执行另一条命令,或者在一条命令执行失败后再执行另一条命令等。shell 提供了 && 和 || 来实现命令执行控制的功能,shell 将根据 && 或 || 前面命令的返回值来控制其后面命令的执行。
语法格式如下:
command1 && command2 [&& command3 ...]
|| 用法
command1 || command2 [|| command3 ...]