• 程序在Linux下前后台切换


    程序在Linux下前后台切换

    一、为什么要使程序在后台执行

    背景:SecureCRT远程连接到linux主机,使程序在后台运行有以下好处:

    (1)本机关机不影响linux主机运行

    (2)不影响计算效率

    (3)让程序在后台运行,不会占据终端,终端可以做别的事情

    二、怎么样使程序在后台执行

             方法有很多,这里主要列举两种(例如有个脚本文件test.sh可执行文件,详见文章末尾)

             方法1在终端输入命令:

                       $ test.sh >> test.txt &

                       解释:将test.sh放在后台运行并把终端输出存放(追加)在test.txt

             注意:

                       (1)执行exit命令退出当前session, 则 test.sh这个脚本仍然在Linux系统里面运行

                       (2)不执行exit命令退出,而直接断开当前连接,则 test.sh脚本会立即退出

        方法2在终端输入命令:

                       $ nohup test.sh >> test.txt &

                       解释:将test.sh放在后台运行并把终端输出存放(追加)在test.txt

             注意:

                       此方法针对上面的两中情况脚本都会在系统上运行,不管什么时候如果想把脚本放到后台执行,都需要执行此命令 “nohup 命令 &”。

    三、常用任务管理命令

    # jobs      //查看任务,返回任务编号n和进程号

    # bg  %n   //将编号为n的任务转后台运行

    # fg  %n   //将编号为n的任务转前台运行

    # ctrl+z    //挂起当前任务

    # ctrl+c    //结束当前任务

    注:jobs 只是显示当前shell环境中的任务。如果要使在前台执行任务放到后台运行,则先要用ctrl+z挂起该任务,然后用bg使之后台执行

    附:

    在Linux中,如果要让进程在后台运行,一般情况下,我们在命令后面加上&即可,实际上,这样是将命令放入到一个作业队列中了:

    $ ./test.sh &

    [1] 17208

    $ jobs -l

    [1]+ 17208 Running                 ./test.sh &

    对于已经在前台执行的命令,也可以重新放到后台执行,首先按ctrl+z暂停已经运行的进程,然后使用bg命令将停止的作业放到后台运行:

    $ ./test.sh

    [1]+  Stopped                 ./test.sh

    $ bg %1

    [1]+ ./test.sh &

    $ jobs -l

    [1]+ 22794 Running                 ./test.sh &

    但是如上方到后台执行的进程,其父进程还是当前终端shell的进程,而一旦父进程退出,则会发送hangup信号给所有子进程,子进程收到hangup以后也会退出。如果我们要在退出shell的时候继续运行进程,则需要使用nohup忽略hangup信号,或者setsid将将父进程设为init进程(进程号为1)

    $ echo $$

    21734

    $ nohup ./test.sh &

    [1] 29016

    $ ps -ef | grep test

    515      29710 21734  0 11:47 pts/12   00:00:00 /bin/sh ./test.sh

    515      29713 21734  0 11:47 pts/12   00:00:00 grep test

    $ setsid ./test.sh &

    [1] 409

    $ ps -ef | grep test

    515        410     1  0 11:49 ?        00:00:00 /bin/sh ./test.sh

    515        413 21734  0 11:49 pts/12   00:00:00 grep test

    上面的试验演示了使用nohup/setsid加上&使进程在后台运行,同时不受当前shell退出的影响。那么对于已经在后台运行的进程,该怎么办呢?可以使用disown命令:

    $ ./test.sh &

    [1] 2539

    $ jobs -l

    [1]+  2539 Running                 ./test.sh &

    $ disown -h %1

    $ ps -ef | grep test

    515        410     1  0 11:49 ?        00:00:00 /bin/sh ./test.sh

    515       2542 21734  0 11:52 pts/12   00:00:00 grep test

    另外还有一种方法,即使将进程在一个subshell中执行,其实这和setsid异曲同工。方法很简单,将命令用括号() 括起来即可

    $ (./test.sh &)

    $ ps -ef | grep test

    515        410     1  0 11:49 ?        00:00:00 /bin/sh ./test.sh

    515      12483 21734  0 11:59 pts/12   00:00:00 grep test

    还有一种更加强大的方式是使用screen,首先创建一个断开模式的虚拟终端,然后用-r选项重新连接这个虚拟终端,在其中执行的任何命令,都能达到nohup的效果,这在有多个命令需要在后台连续执行的时候比较方便:

    $ screen -dmS screen_test

    $ screen -list

    There is a screen on:

            27963.screen_test       (Detached)

    1 Socket in /tmp/uscreens/S-jiangfeng.

    $ screen -r screen_test

    注:本文试验环境为Red Hat Enterprise Linux AS release 4 (Nahant Update 5),shell为/bin/bash

    test.sh

    #!/bin/sh

    #每天晚上0点30分跑批

    #获取当前时间

    DATE=`date +%Y%m%d`

    RUN_TIME=`date +%H%M%S`

    COUNT=1

    echo $DATE

    echo $RUN_TIME

    while true

    do

        RUN_TIME=`date +%H%M%S`

        if [ $RUN_TIME -eq "003000" ]

        then

            ./cronlist

        fi

        sleep 1

    done

    echo "exit"

  • 相关阅读:
    2018山东省赛补题
    USACO 2006 November Gold Corn Fields /// 状压 oj23941
    East Central North America 2006 Hie with the Pie /// 状压dp oj22470
    USACO 2003 Fall Orange Cow Exhibition /// 负数01背包 oj22829
    UASCO Cow Pedigrees /// oj10140
    滑雪 矩阵中的最长上升路径 /// 记忆化DFS || DP oj22919
    十四届华中科大赛补题
    USACO 2007 February Silver The Cow Lexicon /// DP oj24258
    POJ 3252 区间内一个数的二进制中0的数量要不能少于1的数量(数位DP)
    HDU 4734 F(x) (数位DP)
  • 原文地址:https://www.cnblogs.com/uriel/p/4221346.html
Copyright © 2020-2023  润新知