如何在用户退出linux系统时使一个进程仍然继续执行
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在用户退出linux系统时使一个进程仍然继续执行相关的知识,希望对你有一定的参考价值。
一般有以下几种方法:1)在输入命令的最前面加上nohup命令
如nohup your_command & 这样命令在你退出后仍然会在后台执行
2)setsid命令
setsid your_command该命令的结果是使你所运行的命令的父进程为init,所以只有关机该进程才会停止
3)(your_command &)
就是用括号将你的命令括起来,这样做也是使命令的父进程为init
4)disown
当你在命令行下输入your_command &后命令就在后台执行了,然后执行jobs命令,该命令会列出当前正在后台执行的命令。例如输入命令“top&”
然后执行"jobs"
输出结果是
[1] + Suspended (tty output) top
注意行开头方括号内的数字,该数字叫做jobspec,是给当前后台运行的job的编号。这是你只要在命令行下输入"disown -h 1" 后台运行的top命令就不会受到hangup信号的影响了。
5)使用screen命令
在
命令行下输入screen命令就开启了一个screen进程,它就好像是一个全新的命令运行环境,在该环境中你可以像在正常的terminal下那样执行
命令,但是这个screen是不受其父进程的hangup信号的影响的,既然screen不受其父进程影响,当你意外掉线或者退出系统时,在screen
中仍在执行的命令仍然会继续执行。关于screen命令的使用方法你可以再去查阅相关资料。 参考技术A nohup 命令 用途:不挂断地运行命令。 语法:nohup Command [ Arg ... ] [ & ] 描述:nohup 命令运行由Command 参数和任何相关的Arg 参数指定的命令,忽略所有挂断(SIGHUP)信号。在注销后使用nohup 命令运行后台中的程序。要运行后台中的nohup 命令,添加& ( 表示"and"的符号)到命令的尾部。
如何从父进程获取子进程的状态,即它是停止、继续还是退出?对于 Linux,C 语言
【中文标题】如何从父进程获取子进程的状态,即它是停止、继续还是退出?对于 Linux,C 语言【英文标题】:How do I get the status of a child process from a parent, i.e. has it stopped, continued, or exited? For Linux, C lang 【发布时间】:2021-07-07 04:16:53 【问题描述】:这是 Linux (ubuntu) 中的 C 语言程序。我一直在试图弄清楚如何从父进程那里获取子进程的状态。
我编写了一个简单的子进程,它在 25 秒内计数到 25,并将滴答计数输出到标准输出。在父进程中,我 1> 停止子进程 几秒钟。 2> 继续 几秒钟,然后 3> 杀死子进程。 我想获取我一直在使用的子进程的状态waitpid() 函数。但是,我发现如果我使用标志:
waitCondition = WUNTRACED | W继续
它确实返回“已停止”状态,但在处于继续状态时会挂起。
相反,如果我将标志设置为:
waitCondition=WUNTRACED | W续 |挂机
停止状态没有注册,但是继续状态是通过waitpid()注册的。
我正试图让父级在停止、继续或退出时识别状态。
我有下面的代码。有没有人对此有任何想法?谢谢!
int waiting4pid()(pid_t processID)
int waitCondition = WUNTRACED | WCONTINUED;
int currentState;
while (waitpid(processID,¤tState,waitCondition) > 0)
if(WIFCONTINUED(currentState))
printf("\n currentState = continued!\n");
if(WIFSIGNALED(currentState))
printf("\n currentState = signaled!\n");
if(WIFSTOPPED(currentState))
printf("\n currentState = stopped!\n");
void sigTest()
pid_t processID;
processID = fork();
if(processID ==0) // child
// tmp/loop is an application that counts to 25 in 25 seconds and then exits.
execlp("tmp/loop", "tmp/loop", NULL);
else
sleep(2);
printf("\n Stop!");
kill(processID, SIGSTOP);
waiting4pid()(processID);
sleep(2);
printf("\n Continue!");
kill(processID,SIGCONT);
waiting4pid()(processID);
sleep(2);
printf("\n Kill!");
kill(processID, SIGKILL);
waiting4pid()(processID);
void main()
sigTest();
【问题讨论】:
您希望waitpidstatus
函数如何退出while
循环?您向孩子发送信号,然后致电waitpidstatus
。然后waitpidstatus
将获取状态更改并返回等待下一个状态更改。但是不会有下一个状态变化,因为父级现在在waitpidstatus
上被阻止,因此它无法发送下一个信号。
@kaylum 谢谢!我对 waitpid() 的工作原理有一个误解。
【参考方案1】:
为了检查进程是否退出,请执行以下操作:
if(WIFEXITED(status)
// do your stuff
// you can also check the exit status
if(WEXITSTATUS(status) != EXIT_SUCCESS)
// the child process exited with error
正如@kaylum 在问题下的评论中已经提到的那样,waitpid()
调用会阻塞,直到孩子改变状态。但是您可以通过调用waitpid()
并设置WNOHANG
标志来修改此行为(如果您需要监视子进程但同时在父进程中执行一些其他操作,这将很有用;或者您可以waitpid()
in一个单独的线程)。
【讨论】:
以上是关于如何在用户退出linux系统时使一个进程仍然继续执行的主要内容,如果未能解决你的问题,请参考以下文章
java中如何终止当前方法,但不退出系统仍然继续下个方法计算?