linux命令后加一个 &
默认情况下,进程是在前台运行的,这时就把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命令才能看到。另外还可以看到,用户关闭终端窗口或注销也不会影响守护进程的运行。
linux命令后加一个 &的更多相关文章
- 震惊,当我运行了这条Linux命令后,服务器竟然... (Linux中的删除命令)
震惊,当我运行了这条Linux命令后,服务器竟然... 0X00 写在前面 大家都听说过删库命令rm -rf /*,但是谁又真正实践过呢?但作为一个程序员,不看看这条命令执行后会发生什么,怎么能甘心呢 ...
- Linux命令后面加 & 的作用
在命令的后面加一个 & 的作用是,将这个任务放到后台执行.看下面的例子. 输入gedit回车,可以看到,打开了Linux的文本编辑器,但是命令窗口执行不了其他命令了,只有退出文本编辑器才能继续 ...
- 5个相见恨晚的Linux命令,每一个都非常实用
转至:https://zhuanlan.zhihu.com/p/57866239 作为一个开发人员,经常要用到终端命令,最让人头疼的是记不住繁琐的参数.用谷哥度娘检索效率低下,通过man命令显示的结果 ...
- Linux 命令后&的作用
cp $filename /dev/ & & 代表非阻塞方式拷贝文件,如果不加& 则必须等到执行完该指令后才能执行后来的指令.
- (6)sudo命令详解(每周一个linux命令系列)
首先说句抱歉,最近事情比较复杂,停更了一阵子.我又回来啦 多用户管理 我们常用的windows个人系统虽然可以设置多用户,但是实际上是不可以多用户同时登陆的(这个我实验过,我以前用windows服务器 ...
- Linux 命令快捷键
Linux 命令快捷键 tab 自动补齐(有不知道的吗)Ctrl+u 删除(剪切)此处至开始所有内容 Ctrl+k 删除从光标所在位置到行末 快速命令行 – 快捷方式• history 搜索历史执行过 ...
- 《Linux命令行与shell脚本编程大全》 第十五章 学习笔记
第十五章:控制脚本 处理信号 重温Linux信号 信号 名称 描述 1 HUP 挂起 2 INT 中断 3 QUIT 结束运行 9 KILL 无条件终止 11 SEGV 段错误 15 TERM 尽可能 ...
- 【运维】Java开发人员掌握的Linux命令
作为Java开发人员,要掌握常用的Linux命令. 为什么要写此文,笔者的Linux很厉害?NoNoNo,正因为笔者不熟悉Linux才写此文,以作整理. 最主要的命令 查询命令的简要用法,help 当 ...
- 新手必须掌握的Linux命令(上)
1.1强大好用的Shell 通常来讲,计算机硬件是有运算器,控制器,存储器,输入/ 输出设备等共同组成的,而让各种硬件设备各司其职且又能协同运行的东西就是系统内核.Linux系统的内核负责完成对 ...
随机推荐
- nowcoder提高组2题解
T1 化一下试子就ok code #include<cstdio> #include<algorithm> inline long long read() { long lon ...
- Android摘抄总结
著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:葛小葛链接:http://www.zhihu.com/question/27069588/answer/38417756来源: ...
- Android Binder学习的网站
1. Binder系列 http://gityuan.com/2015/10/31/binder-prepare/ 2. Binder机制 http://jcodecraeer.com/a/anzhu ...
- 未能加载文件或程序集“Benlai.SOA.Framework.Common, Version=1.4.0.0, Culture=neutral, PublicKeyToken=null”或它的某一个依赖项。系统找不到指定的文件。
未能加载文件或程序集“Benlai.SOA.Framework.Common, Version=1.4.0.0, Culture=neutral, PublicKeyToken=null”或它的某一个 ...
- centos 6.4配置samba+ldap认证
原文地址:http://www.centoscn.com/image-text/config/2015/0716/5866.html 1. 什么是samba Samba服务类似于windows上的共 ...
- 递归与迭代的联系以及优缺点(以c++为例)
1.递归的定义: 程序直接或间接的调用自身的方法. 递归算法的特点:(1) 递归就是在过程或函数里调用自身.(2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口.(3) 递归算法解题通 ...
- Java HashSet工作原理及实现
1. 概述 This class implements the Set interface, backed by a hash table (actually a HashMap instance). ...
- 关于three.js中添加文字的方式[转]
https://blog.csdn.net/qq563969790/article/details/76584976 网上资料大部分是通过引入外部font库进行文字效果的载入,但是在实际运行的时候发现 ...
- mipmap和drawable文件夹的区别
在Android上创建工程,会默认创建mipmap文件夹.之前在Eclipse上创建的是drawable的文件夹.那么这两个有什么区别呢? 问题: I'm working with android s ...
- 防止UI界面被输入法遮挡(画面随输入法自适应)
应用过Android手机的朋友都知道,有时候在文本框中输入文字后,操作按钮被输入法遮挡了,不得不关闭输入法才可以继续操作. 比如下面这个画面: 画面布局: <?xmlversion=" ...