3、子进程再次fork一个进程,这个进程可以称为孙子进程,然后子进程退出。 4、重定向孙子进程的标准输入流,标准输出流,标准错误到/dev/null #!...'/dev/null', stderr='/dev/null'): # 重定向标准文件描述符(默认情况下定向到/dev/null) try: pid = os.fork...2.修改子进程的工作目录 子进程在创建的时候会继承父进程的工作目录,如果执行的程序是在U盘里面,就会导致U盘不能卸载。...,fork孙子进程处理, 6.重定向孙子进程的标准输入流,标准输出流,标准错误流到/dev/null 因为是守护进程,本身已经脱离了终端,那么标准输入流,标准输入流,标准错误流就没有什么意义了,所以都转向到.../dev/null,就是丢弃的意思
实际上一般的进程(前后台) 在关闭终端窗口后,会收到 SIGHUP 信号导致中断,可以使用 nohup command args > /dev/null 2>&1 & 来忽略 hangup 信号,或者直接使用...四、创建守护进程步骤 调用fork(),创建新进程,它会是将来的守护进程 在父进程中调用exit,保证子进程不是进程组组长 调用setsid创建新的会话期 将当前目录改为根目录 将标准输入、标准输出...、标准错误重定向到/dev/null 成功调用setsid函数的结果是: 创建一个新的Session,当前进程成为Session Leader,当前进程的id就是Session的id。.../null", O_RDWR); // 将标准输入,标准输出等都重定向到/dev/null dup(0); dup(0); } return 0; }...noclose:=0将标准输入、标准输出、标准错误重定向至“/dev/null” 注:也有一些说法,表示daemon 实现是fork 2 次,具体可以google fork 2 times daemon
注意,所有守护进程都以超级用户(用户ID为0)的优先权运行。没有一个守护进程具有控制终端,终端名称设置为问号(?)、终端前台进程组ID设置为-1。缺少控制终端是守护进程调用了setsid的结果。...6、某些守护进程可以打开/dev/null使其具有文件描述符0、1、2,这使任何一个试图读标准输入、写标准输出或标准错误的库例程都不会产生任何效果。...7、忽略SIGCHLD信号 这一步并非必须的,只对需要创建子进程的守护进程才有必要,很多服务器守护进程设计成通过派生子进程来处理客户端的请求,如果父进程不对SIGCHLD信号进行处理的话,子进程在终止后变成僵尸进程...,通过将信号SIGCHLD的处理方式设置为SIG_IGN可以避免这种情况发生。...stdout='/dev/null', stderr='/dev/null'): #重定向标准文件描述符(默认情况下定向到/dev/null) try: pid = os.fork
首先,什么是守护进程? 守护进程是一个在后台长期运行并且不受任何终端控制的进程。 其次,为什么需要守护进程?...六、Dup file descriptors 0 1 2 to /dev/null.--屏蔽掉标准输入,标准输出,标准错误输出。...umask(0); // 6.将标准输出和标准输入重定向到/dev/null。..., "open(\"/dev/null\") failed"); return NGX_ERROR; } if (dup2(...两次fork 守护进程两次调用fork就是出于僵尸进程的考虑:父进程生成守护进程后,还有其它事情要做,其『人生意义』不止是创建守护进程。
(0)文件创建屏蔽字,也就是文件的特殊权限设置(PHP手册) 将进程设置为会话首进程,也就是开启两个进程,父进程退出,子进程设置setsid(什么是会话?...如何编写) 将文件的目录设置为根目录 关闭文件的标准输入、标准输出、标准错误[0,1,2],也就是当程序开启守护进程后,不在接收控制终端的控制影响如:按Ctrl+C退出程序等等 编写程序 //第一步 umask...(STDIN); fclose(STDOUT); fclose(STDERR); // 这里用dev/null来代替标准输入,标准输出,标准错误,dev/null 表示空设备文件或黑洞文件,所有写入其中的数据...执行命令ps -aux 查看进行,发现该进程下并没有控制终端,并且在睡眠状态下 以上则是简单的守护进程编写,当然也可以再以上的基础上进阶,比如开启守护进程后,创建多进程,子进程监听请求并写文件或者写日志...,子进程接收到信号退出后,父进程清理子进程并退出等等 本文为北溟有鱼QAQ原创文章,转载无需和我联系,但请注明来自北溟有鱼QAQ https://www.umdzz.cn
守护进程英文为daemon,像httpd,mysqld,最后一个字母d其实就是表示daemon的意思。 守护进程的编写步骤: fork子进程,然后父进程退出,此时子进程会被init进程接管。...重定向孙子进程的标准输入流,标准输出流,标准错误到/dev/null 完成上面的4个步骤,那么最终的孙子进程就称为守护进程,先看下代码,后面分析下步骤的原因。 #!...2.修改子进程的工作目录 子进程在创建的时候会继承父进程的工作目录,如果执行的程序是在U盘里面,就会导致U盘不能卸载。...为了避免这个问题,fork孙子进程处理, 6.重定向孙子进程的标准输入流,标准输出流,标准错误流到/dev/null 因为是守护进程,本身已经脱离了终端,那么标准输入流,标准输入流,标准错误流就没有什么意义了...,所以都转向到/dev/null,就是丢弃的意思 我们来运行一个这个程序,看看效果 ?
在调用 fork 函数时,子进程继承了父进程的会话、进程组、控制终端等,虽然父进程退出了,但原先的会话期、进程组、控制终端等并没有改变,因此,那还不是真正意义上使两者独立开来。...因此,把文件权限掩 码设置为 0,确保子进程有最大操作权限、这样可以大大增强该守护进程的灵活性。设置文件权限掩码的函数是 umask,通常的使用方法为 umask(0)。 关闭不再需要的文件描述符。...将文件描述符号为 0、1、2 定位到/dev/null。将守护进程的标准输入、标准输出以及标准错误重定向到/dev/null,这使得守护进程的输出无处显示、也无处从交互式用户那里接收输入。...,则子进程将成为僵尸进程;如果父进程 wait 等待子进程退出,将又会增加父进程的负担、也就是增加服务器的负担,影响服务器进程的并发性能,在 Linux 下,可以将 SIGCHLD 信号的处理方式设置为...运行之后,没有任何打印信息输出,原因在于守护进程已经脱离了控制终端,它的打印信息并不会输出显示到终端,在代码中已经将标准输入、输出以及错误重定位到了/dev/null,/dev/null 是一个黑洞文件
为标准输入,标准输出和标准错误输出建立新的文件描述符。即使你不打算 使用它们,打开着它们不失为一个好主意。...准确操作这些描述符是基于各自 爱好;比如说,如果你有一个日志文件,你可能希望把它作为标准输出和标 准错误输出打开,而把‘/dev/null’作为标准输入打开;作为替代方法...,你可 以将‘/dev/console’作为标准错误输出和/或标准输出打开,而‘/dev/null’作 为标准输入,或者任何其它对你的守护程序有意义的结合方法。...tid=239&goto=lastpost&highlight=自行查看): def daemonize(stdout='/dev/null', stderr=None, stdin='/dev/null...()的返回值大于零(即子进程的PID),子进程os.fork()的返回值等于零,父进程结束,子进程继续执行,这时候又遇到第二个os.fork(),如上次一样,原来的子进程变成了父进程,又产生新的子进程,
>/dev/null 2>&1 这句话的含义及使用的意义 /dev/null代表空设备文件,类似于Windows的回收站。...1表示STDOUT标准输出,是标准输出文件描述符,默认对应屏幕。系统默认值是1,所以”>/dev/null”等同于”1>/dev/null”。...那么2>&1 >/dev/null 与 >/dev/null 2>&1 的区别是什么呢?...command >/dev/null 2>&1 相当于 stdout="/dev/null" stderr=$stdout 这时,stderr也等于”/dev/null”了 结果是标准输出和标准错误都指向了...stdout="/dev/null" #stdout指向了/dev/null,但不会影响到 stderr的指向 结果是标准错误仍然被打印到屏幕上, 而标准输出被丢弃。
可以看到,我们起了一个PID为1779的进程,进程在不断向我们打印ping的结果,那么本质上来讲是什么样的呢? 我们使用 ps ajfx 来看一下 ?...,终端前台进程组ID设置为-1 工作目录为 \ (根) 这其中很明显不完全准确,但是也都是基于实际情况分析出来的,所以我一直在纠结后台进程、nohup起的后台进程和守护进程是什么关系,直到遇到了这篇文章...在关闭了文件描述符0、1和2之后,daemon通常会打开/dev/null并使用dup2()(或类似的函数)使所有这些描述符指向这个设备。..., 终端前台进程组ID设置为-1 杀死守护进程没啥特别的,该杀杀,当然前提是权限要够 ---- 看到这里已经可以了,基本上知识点都接触到了,下面是我在关于进程相关知识学习过程中思考的一些问题,不解决不舒服那种...还是存在标准输出,只不过是重定向到 nohup.out中了 3. ping www.baidu.com > /dev/null 2>&1 & 更像是守护进程了吗 更像了,但还不是 ?
需要说明的是,该方法在python3.x中才有。 call()方法启动的进程,其标准输入输出会绑定到父进程的输入和输出。调用程序无法获取命令的输出结果。...bufsize:缓冲区大小,可不用关心 stdin,stdout,stderr:分别表示程序的标准输入,标准输出及标准错误 shell:与上面方法中用法相同 cwd:用于设置子进程的当前目录 env:用于指定子进程的环境变量...,用Python当参数,输Python进入环境 stdin 标准输入 stdout 标准输出 stderr 标准错误 pid the process ID of the child process --...输出,错误句柄 preexec_fn:只在Unix平台下有效,用于指定一个可执行对象,它将在子进程运行之前被调用 close_sfs:在Windows平台下,如果close_sfs被设置为True,则新创建的子进程将不会继承父进程的输入...、输出、错误管道 所以不能将close_fds设置为True同时重定向子进程的标准输入、输出与错误 shell:同上 cod:用于设置子进程的当前目录 env:用于指定子进程的环境变量。
守护进程的父进程是init进程,因为它真正的父进程在fork出子进程后就先于子进程exit退出了,所以它是一个由init继承的孤儿进程。...(3)调用chdir函数将当前进程工作目录设置为/ 【chdir("/");】 (4)umask设置为0以取消任何文件权限屏蔽,使得进程具有最大的权限 【umask(0);】 (5...(6)将0、1、2三个文件描述符定位到/dev/null(也就是把这个进程的标准输入、标准输出和标准出错信息全部绑定到/dev/null) 3、示例代码编写: 任何一个进程都可以将自己实现成守护进程...} // 执行到这里就是子进程 // setsid将当前进程设置为一个新的会话期session,目的就是让当前进程 // 脱离控制台。.../null", O_RDWR); open("/dev/null", O_RDWR); open("/dev/null", O_RDWR); } 输出结果,我们可以看到终端上看不到打印 "I
>::: 参数如下: id: id 会等于/dev/id, 用做终端(标准输入、标准输出以及标准错误) ,这个可以不需要设置,因为/etc/console...已经设为标准输入输出了,如不设置就等于dev/null,则从控制台输入输出。...如果,上面函数中file == NULL,会配置出什么来?默认的配置文件里内容又是什么?...,只创建子进程,而action=ASKFIRST时,需要一直等待用户回车才创建子进程 4.通过前面的分析,制作一个最小的根文件系统至少需要: (1)/dev/console(终端控制台, 提供标准输入、...标准输出以及标准错误) /dev/null (为空的话就是/dev/null, 所有写到这个文件中的数据都会被丢弃掉。)
strace的每一行输出包括系统调用名称,然后是参数和返回值.这个例子: strace cat /dev/null 他的输出会有: open(/"/dev/null/",O_RDONLY) = 3.../null/": lstat(/"/dev/null/",{st_mode=S_IFCHR|0666},st_rdev=makdev[1,3],...}) = 0 请注意/"struct stat/...-d 输出strace关于标准错误的调试信息. -f 跟踪由fork调用所产生的子进程....-ff 如果提供-o filename,则所有进程的跟踪结果输出到相应的filename.pid中,pid是各进程的进程号. -F 尝试跟踪vfork调用.在-f时,vfork不被跟踪....-x 以十六进制形式输出非标准字符串 -xx 所有字符串以十六进制形式输出. -a column 设置返回值的输出位置.默认为40.
我们知道,Linux启动时,最开始会创建init进程,其余的程序都是这个进程的子进程。...对于每个Linux进程,其都是init的子进程,包括bash命令窗口,而其中执行的shell命令,则更是如此。...我们又知道,在Linux中,子进程会继承父进程的文件描述符,所以说,Linux中每个程序,执行的每个shell命令,拥有这三个文件描述符,而程序后续打开的文件,其文件描述符则(从3开始)依次增加。.../dev/null 这个设备,是linux 中黑洞设备,什么信息只要输出给这个设备,都会给吃掉。...- 关闭所有输出 和上面类似:ls exists.txt no-exists.txt 1 > /dev/null 2 > /dev/null ls exists.txt no-exists.txt
来源:公众号【编程珠玑】 作者:守望先生 ID:shouwangxiansheng 之前在《如何让程序真正地后台运行》一文中提到了程序后台运行的写法,但是里面的示例程序在某些场景下是会有问题的,这里先不说什么问题...,&rl) < ) { perror("get file decription failed"); return -1; } /*如果无限制,则设置为...这要从fork说起,之前在《如何创建子进程?》...--《如何创建子进程?》...标准输入,输出和标准错误--《如何理解Linux shell中"2>&1"》 查看进程打开文件信息--《如何查看linux中文件打开情况》 查找大文件--《find命令高级用法》 /dev/null特殊文件的用法
,它的作用是将“%”后面的内容作为标准输入传递给第三个fork出来的进程。...注意fork出来的进程没有忽略(ignore)管道信号(SIGPIPE),所以如果遇到SIGPIPE,则会导致进程无声无息的退出,比如标准输主输出重定向管道的读端被关闭了,写时就会触发SIGPIPE。...fork出来的子进程,没有对SIGPIPE进行任何处理,默认行为是悄悄退出进程。...5. cron&crontab cron是一个在后台运行的守护进程,而crontab是一个设置cron的工具。cron调度的是/etc/crontab文件。...这个时候只有人工kill这个挂起的cron子进程。
运行时的 pty 首先通过 fork+exec 产生 slowout 子进程,其中标准输入、输出分别重定向到中间的伪终端从设备(pty slave device), 然后它自身又通过 fork 一分为二...作者认为问题出现在 pty 父进程向 pty 子进程发送的这个 SIGTERM 信号上,因为重定向到 /dev/null 后,pty 父进程会从 stdin 读到 EOF, 从而向 pty 子进程发送...所以他为 pty 程序加了一个 -i 选项,如果该选项生效, 就在父进程读 stdin 失败后,不再向子进程发送 SIGTERM 信号,从而允许 pty 子进程读 slowout 的输出直到 slowout.../slowout 可以通过 ps 命令观察到卡死的进程,7650 为 pty 子进程,7649 为 slowout 子进程,7648 为 pty 父进程已退出。...但是 pty 父进程早就因为读取 /dev/null 得到 EOF 而退出了,只不过临退出前因为指定了 -i 参数,没有将 pty 子进程一并结束罢了。
system函数可以将字符串转化成命令在服务器上运行;其原理是每一条system函数执行时,其会创建一个子进程在系统上执行命令行,子进程的执行结果无法影响主进程。...,NONE表示不进行重定向,继承父进程,PIPE表示创建管道 stdout 程序的标准输出句柄,参数意义同上 stderr 程序的标准错误句柄,参数意义同上,特殊,可以设置成STDOUT,表示与标准输出一致...shell 为True时,表示将通过shell来执行 cwd 用来设置当前子进程的目录 env 用于指定子进程的环境变量。...注意:如果希望通过进程的stdin向其发送数据,在创建Popen对象的时候,参数stdin必须被设置为PIPE。...6、Popen.kill():杀死子进程。 7、Popen.stdin:如果在创建Popen对象是,参数stdin被设置为PIPE,Popen.stdin将返回一个文件对象用于策子进程发送指令。
date "+%F %T" timedatectl ntpdate 管道 管道一般用于过滤, A|b 命令A的正确输出作为命令B的操作对象 grep 取出含有搜寻内容的行 -v 反选,: ## tail 出有关键字的日志并输出后...nohup test.jar >/dev/null 2>&1 & # 将错误输出输出到屏幕,标准输出丢弃 nohup test.jar >/dev/null 2>&1 & 计划任务 at 一次性计划任务...cron 周期性计划任务 crond crontable 使用crontable 创建任务后任务会记录到/var/sponl/cron里面去 执行日志保存到/var/log/cron中 ## 这里,我们在每天早上...表示获取执行上一个指令的返回值(0为成功,非0为失败) 变量截取 ${变量名:起始位置:截取长度} 表达式 test 条件表达式 [ 条件表达式 ] 命令1 && 命令2 短路判断(如果命令1执行成功...Type=simple:默认值,执行ExecStart指定的命令,启动主进程 Type=forking:以 fork 方式从父进程创建子进程,创建后父进程会立即退出 Type=oneshot:一次性进程
领取专属 10元无门槛券
手把手带您无忧上云