Rekord
文章34
标签24
分类4
程序后台执行的一次尝试

程序后台执行的一次尝试

约608字 预计需要2分钟

最近在写一个程序脚本,使其能够在服务器后台间隔执行。
因为初学,初步了解到可以通过./script.sh &实现需求。

因为我的shell程序第一行有用#!/bin/bash进行声明,所以使用上述方式能够正确完成目标。
但问题在于登出shell后由该shell所启动的进程都会终止,即使是后台程序也不例外。

当我准备使用其他命令去实现该功能时,中途顺便使用ps auxtop命令查看了我的进程列表,惊奇的发现我的脚本仍然在执行!
但是用jobs命令看不到该脚本任务.(显然是因为该脚本任务并非运行在当前终端)
进一步我使用ps aux得知了该脚本任务的shell是**”?”**。

问题是这个情况是怎么产生的呢?

原因是因为我曾执行了bash ./script.sh &这样的命令。

当我们单独执行bash命令时,程序会在当前shell之上再打开一个bash shell(_使用其他shell也一样_)
这样看执行bash ./script.sh &问题也不大啊!无非是再开一个bash shell然后执行脚本并移至后台运行,登出shell后其上启动的进程(包括后台进程)理论上应该全部关闭。
但显然事实不是这样的。
此时执行bash ./script.sh命令进行测试,由于是前台运行,所以要使程序终止要么使用ctrl+C强制程序终止要么等待程序运行完毕。
实机测试尝试上述两种程序终止的方式,不论采用哪一种方式,程序终止后再按ctrl+D直接退出当前shell!而没有两次shell的退出过程!

到此,迷雾已经散尽!

当我们执行bash ./script.sh &bash ./script.sh命令时,实际并没有再进入一个新的终端,仅相当于在当前shell上运行了一个命令。
而且该命令拥有自己的shell环境,所以即使登出shell后也能正常执行
放在前台执行还好,毕竟退出shell前一般会终止当前运行的进程。但放在后台执行就很危险了。
多来几次这种操作(_特别是程序是非自动终止类型的_),后台会多出许多属于”?”的进程!

本文作者:Rekord
本文链接:https://sxrekord.com/An-attem-to-exec-a-prog-itb/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可
×