nohup命令与&区别,jobs,fg,bg,Ctrl-Z、Ctrl-C、Ctrl-D

时间:2021-07-27 02:10:42
&方式:
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://www.mamicode.com/info-detail-1243407.html