zoukankan      html  css  js  c++  java
  • nohup命令与&区别,jobs,fg,bg,Ctrl-Z、Ctrl-C、Ctrl-D

    &方式:
    Unix/Linux下一般想让某个程序在后台运行,很多都是使用 & 在程序结尾来让程序自动运行。比如我们要运行mysql在后台: 
            /usr/local/mysql/bin/mysqld_safe --user=mysql &
    但是我们很多程序并不象mysqld一样可以做成守护进程,可能我们的程序只是普通程序而已,一般这种程序即使使用 & 结尾,如果终端关闭,那么程序也会被关闭。
     
    nohup方式:

      nohup命令:不挂起的意思( no hang up)。如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用nohup命令。该命令可以在你退出帐户/关闭终端之后继续运行相应的进程.

     比如我们有个start.sh需要在后台运行,并且希望在 后台能够一直运行,那么就使用nohup: 
                nohup /root/start.sh & 
              在shell中回车后提示: 
              [~]$ appending output to nohup.out 
          原程序的的标准输出被自动改向到当前目录下的nohup.out文件,起到了log的作用。
     
    nohup问题:

    nohup /root/start.sh &

    但是有时候在这一步会有问题,当把终端关闭后,进程会自动被关闭,察看nohup.out可以看到在关闭终端瞬间服务自动关闭。
    有个操作终端时的细节当shell中提示了nohup成功后还需要按终端上键盘任意键退回到shell输入命令窗口,然后通过在shell中输入exit来退出终端;而我是每 次在nohup执行成功后直接点关闭程序按钮关闭终端。所以这时候会断掉该命令所对应的session,导致nohup对应的进程被通知需要一起 shutdown。
    这个细节有人和我一样没注意到,所以在这儿记录一下了。
     
    当用户启动一个进程的时候,这个进程是运行在前台,使用与相应控制终端相联系的标准输入、输出 进行输入和输出。即使将进程的输入输出重定向,并将进程放在后台执行,进程仍然和当前终端设备有关系。正因为如此,在当前的登录会话结束时,控制终端设备 将和登录进程相脱离,那么系统就向所有与这个终端相联系的进程发送SIGHUP的信号,通知进程线路已经挂起了,如果程序没有接管这个信号的处理,那么缺 省的反应是进程结束。因此普通的程序并不能真正脱离登录会话而运行进程,为了使得在系统登录后还可以正常执行,只有使用命令nohup来启动相应程序。

    从上面的ps的输出结果可以看出,有些程序没有控制终端,这些程序通常是一些后台进程。使用命令nohup当然可以启动这样的程序,但nohup启动的程序在进程执行完毕就退出,而常见的一些服务进程通常永久的运行在后台,不向屏幕输出结果。在Unix中这些永久的后台进程称为守护进程(daemon)。守护进程通常从系统启动时自动开始执行,系统关闭时才停止。如果偶然某个守护进程消失了,那么它提供的服务将不再能被使用。

    在守护进程中,最重要的一个是超级守护进程inetd, 这个进程接管了大部分网络服务,但并不是对每个服务都自己进行处理,而是依据连接请求,启动不同的服务程序与客户机打交道。inetd支持网络服务种类在 它的设置文件/etc/inet.conf中定义。inet.conf文件中的每一行就对应一个端口地址,当inetd接受到连接这个端口的连接请求时, 就启动相应的进程进行处理。使用inetd的好处是系统不必启动很多守护进程,从而节约了系统资源,然而使用inetd启动守护进程相应反应会迟缓一些,不适合用于被密集访问的服务进程


      如果使用nohup命令提交作业,那么在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中,除非另外指定了输出文件: 
      nohup command > myout.file 2>&1 & 
      在上面的例子中,输出被重定向到myout.file文件中。 
      使用 jobs 查看任务。 
      使用 fg %n 关闭。 
      另外有两个常用的ftp工具ncftpget和ncftpput,可以实现后台的ftp上传和下载,这样就可以利用这些命令在后台上传和下载文件了。

    nohup command和nohup command & 

    这之间的差别是带&的命令行,即使terminal(终端)关闭,或者电脑死机程序依然运行(前提是你把程序递交到服务器上); 
     
     

    0. nohup 命令用于把命令放在系统后台来执行,关闭命令所在的控制台和注销所有的用户都不会有影响
    例如:
    nohup java -jar X.jar >/dev/null &

    Linux下面Job Control的一些知识(包括jobs、bg、fg、kill命令的使用)

    1.通过使用‘&’操作符让Job在后台运行(在后台就不会被ctrl+c中断,但是输出仍然会显示到屏幕上)
    例如:
    user@host:~$ cp /media/bigfile /home/user/Downloads/ &
    [1] 3526
    user@host:~$
    用方括号括起来的数字,表示系统分配给这个Job的Job Number,这里'[1]'中的1,就是这个Job的Job Number。而后面一个比较大的数字,则是系统分配的进程ID


    2.使用jobs,来查看当前系统中的Job

    user@host:~$ jobs
    [1]-  Running                 cp /media/bigfile /home/user/Downloads/ &
    [2]+  Stopped                 cat
    user@host:~$

    这里‘Running’、‘Stopped’表示任务的状态。
    语法:jobs [-p | -l] [-n] [-p] [-x] [job id]
    参数:
    -p | -l : Report the process group ID and working directory of the jobs.
    -n      : Display only jobs that have stopped or exited since last notified.
    -p      : Displays only the process IDs for the process group leaders of the selected jobs.
    -x      : Replace any job_id found in command or arguments with the corresponding
               process group ID, and then execute command passing it arguments.
    job id  : The job id.

    3.Suspend key 和 bg(将一个正在运行的job放到后台运行
    Suspend Key,通常是Ctrl-Z将该任务挂起(也就是暂停),然后使用‘bg’命令在后台让该job恢复执行。

    user@host:~$ cp bigfile bigfile.bac
    ^Z
    [1]+  Stopped                 cp bigfile bigfile.bac
    user@host:~$ bg %1
    [1]+ cp bigfile bigfile.bac &
    user@host:~$


    4.使用fg命令,将在后台的job换到前台
    user@host:~$ cp bigfile bigfile.bac &
    [1] 3815
    user@host:~$ fg 1
    cp bigfile bigfile.bac

    5.如何结束一个job
    如果你想结束一个正在运行的job,可以使用中断键(interrupt key,通常是Ctrl-C)来结束。
    user@host:~$ cp bigfile bigfile.bac
    ^C
    user@host:~$
    如果上面方法无法正常工作,那么你可以考虑使用Ctrl-Z(Suspend key)来暂停job,使用'jobs'命令来查看这个job的job number,然后通过'kill'命令来结束这个job.
    user@host:~$ cp bigfile bigfile.bac
    ^Z
    [1]+  Stopped                 cp bigfile bigfile.bac
    user@host:~$ jobs
    [1]+  Stopped                 cp bigfile bigfile.bac
    user@host:~$ kill %1
    user@host:~$
    [1]+  Terminated              cp bigfile bigfile.bac
    'kill %1'中的'%'告诉系统,后面的数字是一个job number。默认情况下,kill将会向程序发送一个termination signal(-TERM)。如果这个信号不起作用,考虑使用'kill -kill %job number'来发送一个kill signal(-KILL)。
    'kill'命令的使用,就看man把,info也可以,这里不说了,上面东西太多。不过常用的也就'kill %job number'、'kill -kill %job number'、'kill [-kill] PID'。

    Linux下Ctrl-Z、Ctrl-C、Ctrl-D的具体含义
        Ctrl-Z:该键是linux下面默认的挂起键(Suspend Key),当键入Ctrl-Z时,系统会将正在运行的程序挂起,然后放到后台,同时给出用户相关的job信息。此时,程序并没有真正的停止,用户可以通过 使用fg、bg命令将job恢复到暂停前的上下文环境,并继续执行。
        Ctrl-C:该键是linux下面默认的中断键(Interrupt Key),当键入Ctrl-C时,系统会发送一个中断信号给正在运行的程序和shell。具体的响应结果会根据程序的不同而不同。一些程序在收到这个信号 后,会立即结束并推出程序,一些程序可能会忽略这个中断信号,还有一些程序在接受到这个信号后,会采取一些其他的动作(Action)。当shell接受 到这个中断信号的时候,它会返回到提示界面,并等待下一个命令。
        Ctrl-D:该键是Linux下面标准输入输出的EOF。在使用标准输入输出的设备中,遇到该符号,会认为读到了文件的末尾,因此结束输入或输出。


    1.jobs 只限于某个控制台,控制台间彼此不通用,a控制台中的job ,在b控制台用jobs 看不到 ,但是用ps -aux 可以看到相应进程
    2.job 不管是在前台还是在后台,也不管什么状态,其依赖于所在的控制台,关闭控制台后所有job 将不复存在(错! 用exit)

     

     
    重定向输出到nohup.txt文件这个看似很方便,但是当输出很大的时候,nohup.txt文件会非常大,或者多个后台命令的时候大家都会输出到nohup.txt文件,不利于查找结果和调试程序。
  • 相关阅读:
    HTTP断点续传 规格严格
    Java Shutdown 规格严格
    linux 命令源码 规格严格
    JTable调整列宽 规格严格
    linux 多CPU 规格严格
    Hello can not find git path 规格严格
    Kill 规格严格
    拜拜牛人 规格严格
    Swing 规格严格
    Debugging hangs in JVM (on AIX but methodology applicable to other platforms) 规格严格
  • 原文地址:https://www.cnblogs.com/timssd/p/5297725.html
Copyright © 2011-2022 走看看