如何在用户退出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,&currentState,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系统时使一个进程仍然继续执行的主要内容,如果未能解决你的问题,请参考以下文章

9.10 nohup:用户退出系统进程继续工作

[转载][整理]解决SSH退出登陆后保持进程继续在后台运行

主线程创建了子线程,怎么让主线程退出,而子线程仍然运行

java中如何终止当前方法,但不退出系统仍然继续下个方法计算?

[转帖]Linux系统进程的知识总结,进程与线程之间的纠葛...

怎样查看linux系统日志