【OS】Linux命令如何放到后台运行

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 【OS】Linux命令如何放到后台运行 linux命令后台运行    有两种方式:    1.

【OS】Linux命令如何放到后台运行


linux命令后台运行

   有两种方式:


   1. command & : 后台运行,你关掉终端会停止运行
   2. nohup command & : 后台运行,你关掉终端也会继续运行


   


一、 简介  
    Linux/Unix 区别于微软平台最大的优点就是真正的多用户,多任务。因此在任务管理上也有别具特色的管理思想。
我们知道,在 Windows 上面,我们要么让一个程序作为服务在后台一直运行,要么停止这个服务。而不能让程序在前台后台之间切换。而 Linux 提供了 fg 和bg 命令,让你轻松调度正在运行的任务。假设你发现前台运行的一个程序需要很长的时间,但是需要干其他的事情,你就可以用 Ctrl-Z ,挂起这个程序,然后可以看到系统提示:
[1]+ Stopped /root/bin/rsync.sh
然后我们可以把程序调度到后台执行:(bg 后面的数字为作业号)
#bg 1
[1]+ /root/bin/rsync.sh &
用 jobs 命令查看正在运行的任务:
#jobs
[1]+ Running /root/bin/rsync.sh &
如果想把它调回到前台运行,可以用
#fg 1
/root/bin/rsync.sh
这样,你在控制台上就只能等待这个任务完成了。



&  将指令丢到后台中去执行
[ctrl]+z  將前台任务丟到后台中暂停
jobs  查看后台的工作状态
fg %jobnumber  将后台的任务拿到前台来处理
bg %jobnumber  将任务放到后台中去处理
kill  管理后台的任务


二、&

在Linux中,当在前台运行某个作业时,终端被该作业占据;而在后台运行作业时,它不会占据终端。可以使用&命令把作业放到后台执行。实际上,这样是将命令放入到一个作业队列中了:


$ ./test.sh &
[1] 17208



$ jobs -l
[1]+ 17208 Running                 ./test.sh &
    在后台运行作业时要当心:需要用户交互的命令不要放在后台执行,因为这样你的机器就会在那里傻等。不过,作业在后台运行一样会将结果输出到屏幕上,干扰你的工作。如果放在后台运行的作业会产生大量的输出,最好使用下面的方法把它的输出重定向到某个文件中:
command >out.file 2>&1 &
在上面的例子中, 2>&1 表示所有的标准输出和错误输出都将被重定向到一个叫做out.file 的文件中。 当你成功地提交进程以后,就会显示出一个进程号,可以用它来监控该进程,或杀死它。 
例:查找名为“httpd.conf”的文件,并把所有标准输出和错误输出重定向到find.dt的文件中: 
# find /etc/httpd/ -name "httpd.conf" -print >find.dt 2>&1 & 
[2] 7832 
成功提交该命令之后,系统给出了它的进程号7832。 对于已经在前台执行的命令,也可以重新放到后台执行,首先按ctrl+z暂停已经运行的进程,然后使用bg命令将停止的作业放到后台运行,例如对正在前台执行的tesh.sh使用ctrl+z挂起它:
$ ./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
注:本文试验环境为Red Hat Enterprise Linux AS release 4 (Nahant Update 5),shell为/bin/bash,不同的OS和shell可能命令有些不一样。例如AIX的ksh,没有disown,但是可以使用nohup -p PID来获得disown同样的效果。


还有一种更加强大的方式是使用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


三、 nohup 
    如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用nohup命令。该命令可以在你退出帐户之后继续运行相应的进程。nohup就是不挂起的意思( no hang up)。 该命令的一般形式为: 
nohup conmmand &
如果使用nohup命令提交作业,那么在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中,除非另外指定了输出文件:
nohup command > myout.file 2>&1 
在上面的例子中,输出被重定向到myout.file文件中。




四、.*,?,[...],[!...]等  
下面就是这些特殊字符: 
* 匹配文件名中的任何字符串,包括空字符串。 
? 匹配文件名中的任何单个字符。 
[...] 匹配[ ]中所包含的任何字符。 
[!...] 匹配[ ]中非感叹号!之后的字符。 
当s h e l l遇到上述字符时,就会把它们当作特殊字符,而不是文件名中的普通字符,这样用户就可以用它们来匹配相应的文件名。

1)列出以i或o开头的文件名:     #ls [io]*
2)列出log.开头、后面跟随一个数字、然后可以是任意字符串的文件名: #ls log.[0-9]* 
3)与例二相反,列出log.开头、后面不跟随一个数字、然后可以是任意字符串的文件名 : #ls log.[!0-9]* 
4)列出所有以LPS开头、中间可以是任何两个字符,最后以1结尾的文件名:#ls LPS??1
5)列出所有以大写字母开头的文件名:$ ls [A-Z]* 6)列出所有以. 开头的文件名(隐含文件,例如. profile、.rhosts、.histo ry等): $ ls .*


  • 其他相关命令:


jobs :查看当前有多少在后台运行的命令
fg :将后台中的命令调至前台继续运行。如果后台中有多个命令,可以用 fg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid)
bg :将一个在后台暂停的命令,变成继续执行。如果后台中有多个命令,可以用bg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid)


  • 杀死进程

杀死已经启动的程序和普通方式一样:

  • pkill -9 name
  • killall name
  • kill pid



執行背景工作的指令

指令或符號

使用範例

說明

& % fasta & 在背景中執行程式
jobs % jobs 顯示送入背景之工作
kill % kill (job#) 移除指定之批次工作
ctrl-z   暫停前景中執行之程式
bg % bg 將暫停之工作送入背景執行
fg % fg 將背景之工作拉回前景執行



1.通过使用‘&’操作符让Job在后台运行
通常我们Linux的终端中,运行某一命令时,终端总是等待某一特定的命令或程序运行完以后,给出一个提示,然后我们才能继续运行下一个命令。如果我们要运行一个比较耗时的命令,但是在该命令运行的同时还需要做另外的一些事,那该怎么办呢?
你可以通过在命令的后面加上一个‘&’操作符,来让一个任务在后台运行。(当然如果你是用GUI界面,你也可以重新打开一个窗口运行新的命令或程序)
例如,我们需要拷贝一个比较大的文件,在拷贝的同时,还要做其他一些事情,那么在拷贝命令后面加上一个‘&’,让它在后台拷贝:
lennon@lennon-laptop:~$ cp /media/bigfile /home/lennon/Downloads/ &
[1] 3526
lennon@lennon-laptop:~$ 
此时,我们可以看到在终端中,执行了某一命令后,给出了一些信息,然后就返回了,接着提示用户可以出入下一个命令了,这样程序或命令就在后台执行了。
在显示的信息中,用方括号括起来的数字,表示系统分配给这个Job的Job Number,这里'[1]'中的1,就是这个Job的Job Number。而后面一个比较大的数字,则是系统分配的进程ID(PID),这个PID在系统就代表这个进程。
在后台运行的job,当其运行完成以后,且输入回车后,会在终端中给出一个提示:
lennon@lennon-laptop:~$ rm Downloads/linux_11gR2_database_1of2.zip &
[1] 3666
lennon@lennon-laptop:~$ 
[1]+  Done                    rm Downloads/linux_11gR2_database_1of2.zip

2.使用jobs命令,来查看当前系统中的Job
如果我们需要查看当前系统中,有那些job,使用‘jobs’命令:
lennon@lennon-laptop:~$ jobs
[1]-  Running                 cp /media/bigfile /home/lennon/Downloads/ &
[2]+  Stopped                 cat
lennon@lennon-laptop:~$ 
如此时,显示我的系统中有2个job,一个是刚才的正在运行的拷贝命令([1]标识),一个是停止运行的cat命令([2]表示)。这里‘Running’、‘Stopped’表示任务的状态

jobs命令参考
命令名称:jobs
使用权限:所有权限
命令描述:列出系统中的job。注意:不是所有的shell都能使用此命令
语法: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放到后台运行)
如果你在运行job前,并不知道该job的运行情况,但在job运行了以后,发现这个是耗时的任务,并想将其放入到后台运行,这样你可以在这个任务运行的同时,完成一些其他的事情,那么你可以这样做:
使用挂起键(Suspend Key,通常是Ctrl-Z)将该任务挂起(也就是暂停),然后使用‘bg’命令在后台让该job恢复执行。
lennon@lennon-laptop:~$ cp bigfile bigfile.bac
^Z
[1]+  Stopped                 cp bigfile bigfile.bac
lennon@lennon-laptop:~$ bg %1
[1]+ cp bigfile bigfile.bac &
lennon@lennon-laptop:~$
使用Ctrl-Z后,系统会将当前正在运行的job暂停,将其移至后台,给出用户改任务的提示(包括job number、状态、job),然后提示用户输入下一个命令。
在job挂起后,可以使用‘bg’命令,让job恢复到刚才中断的地方继续运行并将其放到后台运行。使用‘bg %job number’来指定你需要对哪一个job进行操作,这里‘%’告诉系统后面的数字是一个job number(不要‘%’可能也可以)。当然在系统中只有一个job的时候,你也可以忽略改参数。

bg命令参考:
命令名称:bg
使用权限:所有权限
命令描述:在后台恢复已停止的job继续运行。注意该命令不能在所有的Unix的shell下运行
语法:bg [-l] [-p] [-x] [job]
参数:
-l    : Report the process group ID and working directory of the jobs.
-p    : Report only the process group ID of the 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   : Specifies the job that you want to run in the background.

4.使用fg命令,将在后台的job换到前台
当你需要将在后台的job换到前台时,使用‘fg %job number’命令(也许不要‘%’也可以)。
lennon@lennon-laptop:~$ cp bigfile bigfile.bac &
[1] 3815
lennon@lennon-laptop:~$ fg 1
cp bigfile bigfile.bac

fg命令参考:
命令名称:fg
使用权限:所有权限
命令描述:将后台的任务移至前台,如果是该任务处于暂停状态,则恢复该任务的运行。
         注意该命令不是在所有的shell中都能运行。
语法:fg [%job]
参数:
%job : Specifies the job that you want to run in the foreground.

5.如何结束一个job
如果你想结束一个正在运行的job,可以使用中断键(interrupt key,通常是Ctrl-C)来结束。
lennon@lennon-laptop:~$ cp bigfile bigfile.bac 
^C
lennon@lennon-laptop:~$ 
如果上面方法无法正常工作,那么你可以考虑使用Ctrl-Z(Suspend key)来暂停job,使用'jobs'命令来查看这个job的job number,然后通过'kill'命令来结束这个job.
lennon@lennon-laptop:~$ cp bigfile bigfile.bac 
^Z
[1]+  Stopped                 cp bigfile bigfile.bac
lennon@lennon-laptop:~$ jobs
[1]+  Stopped                 cp bigfile bigfile.bac
lennon@lennon-laptop:~$ kill %1
lennon@lennon-laptop:~$ 
[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的具体含义
初识Linux,可能会对Ctrl-Z、Ctrl-C、Ctrl-D的具体含义混淆不清,因为这三个按键都能够在一些情况下使shell退出正在执行的命令或程序,提示用户输入下一个命令,从而对初识者造成假象,认为三个键的功能一样,但具体情况下哪个按键能起作用、起什么作用却拿捏不定。

    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。在使用标准输入输出的设备中,遇到该符号,会认为读到了文件的末尾,因此结束输入或输出。




Linux下使Shell 命令脱离终端在后台运行

  (2012-02-05 21:41:57)

你是否遇到过这样的情况:从终端软件登录远程的Linux主机,将一堆很大的文件压缩为一个.tar.gz文件,连续压缩了半个小时还没有完成,这时,突然你断网了,你登录不上远程Linux主机了,那么前面的半个小时就会前功尽弃,你非常气愤……

在Linux下,如果你要执行的shell命令耗时特别长,并且:(1)你的网络不稳定,随时可能断网;或者(2)你在执行了shell命令之后必须要关闭终端软件(例如SecureCRT)。


那么你就需要以脱离终端的方式在后台运行这个shell命令。

方法如下:

(1)输入命令:

nohup 你的shell命令 &

(2)回车,使终端回到shell命令行;

(3)输入exit命令退出终端:

exit

(4)现在可以关闭你的终端软件了,等过足够的时间,让你的shell命令执行完了再上去看结果吧。

其中,nohup命令可以让你的shell命令忽略SIGHUP信号,即可以使之脱离终端运行;“&”可以让你的命令在后台运行。

以脱离终端的方式在后台运行shell命令有这样几个好处:只要你执行过了命令,那么你的网络中断不会对你有任何影响,并且你就可以关闭终端软件了。

 

本篇文章来源于 Linux公社网站(www.linuxidc.com 原文链接:http://www.linuxidc.com/Linux/2011-05/35723.htm

 

 

 

用运程终端登陆Linux后运行的程序,当关闭终端时程序也被终至,下面的方法可以让程序在后台运行。

Unix/Linux下一般比如想让某个程序在后台运行,很多都是使用 & 在程序结尾来让程序自动运行。比如我们要运行mysql在后台:

  /usr/local/mysql/bin/mysqld_safe --user=mysql &

 但是加入我们很多程序并不象mysqld一样做成守护进程可能我们的程序只是普通程序而已,一般这种程序使用 & 结尾,但是如果终端关闭,那么程序也会被关闭。但是为了能够后台运行,那么我们就可以使用nohup这个命令,比如我们有个test.php需要在后台运行,并且希望在后台能够定期运行,那么就使用nohup:

  nohup /root/test.php &

  提示:

  [~]$ appending output to nohup.out

  嗯,证明运行成功,同时把程序运行的输出信息放到当前目录的 nohup.out 文件中去。


附:nohup命令参考

  nohup 命令

  用途:不挂断地运行命令。

  语法:nohup Command [ Arg ... ] [ & ]

  描述:nohup 命令运行由 Command 参数和任何相关的 Arg 参数指定的命令,忽略所有挂断(SIGHUP)信号。在注销后使用 nohup 命令运行后台中的程序。要运行后台中的 nohup 命令,添加 & ( 表示“and”的符号)到命令的尾部。

  无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中。如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。如果没有文件能创建或打开以用于追加,那么 Command 参数指定的命令不可调用。如果标准错误是一个终端,那么把指定的命令写给标准错误的所有输出作为标准输出重定向到相同的文件描述符。

  退出状态:该命令返回下列出口值:

  126 可以查找但不能调用 Command 参数指定的命令。

  127 nohup 命令发生错误或不能查找由 Command 参数指定的命令。

  否则,nohup 命令的退出状态是 Command 参数指定命令的退出状态。


nohup命令及其输出文件

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

  该命令的一般形式为:nohup command &


使用nohup命令提交作业

  如果使用nohup命令提交作业,那么在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中,除非另外指定了输出文件:

  nohup command > myout.file 2>&1 &

  在上面的例子中,输出被重定向到myout.file文件中。







Linux 技巧:让进程在后台可靠运行的几种方法



我们经常会碰到这样的问题,用 telnet/ssh 登录了远程的 Linux 服务器,运行了一些耗时较长的任务, 结果却由于网络的不稳定导致任务中途失败。如何让命令提交后不受本地关闭终端窗口/网络断开连接的干扰呢?下面举了一些例子, 您可以针对不同的场景选择不同的方式来处理这个问题。


nohup/setsid/&

场景:

如果只是临时有一个命令需要长时间运行,什么方法能最简便的保证它在后台稳定运行呢?

hangup 名称的来由

在 Unix 的早期版本中,每个终端都会通过 modem 和系统通讯。当用户 logout 时,modem 就会挂断(hang up)电话。 同理,当 modem 断开连接时,就会给终端发送 hangup 信号来通知其关闭所有子进程。

解决方法:

我们知道,当用户注销(logout)或者网络断开时,终端会收到 HUP(hangup)信号从而关闭其所有子进程。因此,我们的解决办法就有两种途径:要么让进程忽略 HUP 信号,要么让进程运行在新的会话里从而成为不属于此终端的子进程。

1. nohup

nohup 无疑是我们首先想到的办法。顾名思义,nohup 的用途就是让提交的命令忽略 hangup 信号。让我们先来看一下 nohup 的帮助信息:

NOHUP(1)                        User Commands                        NOHUP(1)

NAME
       nohup - run a command immune to hangups, with output to a non-tty

SYNOPSIS
       nohup COMMAND [ARG]...
       nohup OPTION

DESCRIPTION
       Run COMMAND, ignoring hangup signals.

       --help display this help and exit

       --version
              output version information and exit

可见,nohup 的使用是十分方便的,只需在要处理的命令前加上 nohup 即可,标准输出和标准错误缺省会被重定向到 nohup.out 文件中。一般我们可在结尾加上"&"来将命令同时放入后台运行,也可用">filename 2>&1"来更改缺省的重定向文件名。

nohup 示例
[root@pvcent107 ~]# nohup ping www.ibm.com &
[1] 3059
nohup: appending output to `nohup.out'
[root@pvcent107 ~]# ps -ef |grep 3059
root      3059 984 0 21:06 pts/3    00:00:00 ping www.ibm.com
root      3067   984  0 21:06 pts/3    00:00:00 grep 3059
[root@pvcent107 ~]#

2。setsid

nohup 无疑能通过忽略 HUP 信号来使我们的进程避免中途被中断,但如果我们换个角度思考,如果我们的进程不属于接受 HUP 信号的终端的子进程,那么自然也就不会受到 HUP 信号的影响了。setsid 就能帮助我们做到这一点。让我们先来看一下 setsid 的帮助信息:

SETSID(8)                 Linux Programmer’s Manual                 SETSID(8)

NAME
       setsid - run a program in a new session

SYNOPSIS
       setsid program [ arg ... ]

DESCRIPTION
       setsid runs a program in a new session.

可见 setsid 的使用也是非常方便的,也只需在要处理的命令前加上 setsid 即可。

setsid 示例
[root@pvcent107 ~]# setsid ping www.ibm.com
[root@pvcent107 ~]# ps -ef |grep www.ibm.com
root     31094 1 0 07:28 ?        00:00:00 ping www.ibm.com
root     31102 29217  0 07:29 pts/4    00:00:00 grep www.ibm.com
[root@pvcent107 ~]#

值得注意的是,上例中我们的进程 ID(PID)为31094,而它的父 ID(PPID)为1(即为 init 进程 ID),并不是当前终端的进程 ID。请将此例与nohup 例中的父 ID 做比较。

3。&

这里还有一个关于 subshell 的小技巧。我们知道,将一个或多个命名包含在“()”中就能让这些命令在子 shell 中运行中,从而扩展出很多有趣的功能,我们现在要讨论的就是其中之一。

当我们将"&"也放入“()”内之后,我们就会发现所提交的作业并不在作业列表中,也就是说,是无法通过jobs来查看的。让我们来看看为什么这样就能躲过 HUP 信号的影响吧。

subshell 示例
[root@pvcent107 ~]# (ping www.ibm.com &)
[root@pvcent107 ~]# ps -ef |grep www.ibm.com
root     16270 1 0 14:13 pts/4    00:00:00 ping www.ibm.com
root     16278 15362  0 14:13 pts/4    00:00:00 grep www.ibm.com
[root@pvcent107 ~]#

从上例中可以看出,新提交的进程的父 ID(PPID)为1(init 进程的 PID),并不是当前终端的进程 ID。因此并不属于当前终端的子进程,从而也就不会受到当前终端的 HUP 信号的影响了。

disown

场景:

我们已经知道,如果事先在命令前加上 nohup 或者 setsid 就可以避免 HUP 信号的影响。但是如果我们未加任何处理就已经提交了命令,该如何补救才能让它避免 HUP 信号的影响呢?

解决方法:

这时想加 nohup 或者 setsid 已经为时已晚,只能通过作业调度和 disown 来解决这个问题了。让我们来看一下 disown 的帮助信息:

disown [-ar] [-h] [jobspec ...]
	Without options, each jobspec is  removed  from  the  table  of
	active  jobs.   If  the -h option is given, each jobspec is not
	removed from the table, but is marked so  that  SIGHUP  is  not
	sent  to the job if the shell receives a SIGHUP.  If no jobspec
	is present, and neither the -a nor the -r option  is  supplied,
	the  current  job  is  used.  If no jobspec is supplied, the -a
	option means to remove or mark all jobs; the -r option  without
	a  jobspec  argument  restricts operation to running jobs.  The
	return value is 0 unless a jobspec does  not  specify  a  valid
	job.

可以看出,我们可以用如下方式来达成我们的目的。

灵活运用 CTRL-z

在我们的日常工作中,我们可以用 CTRL-z 来将当前进程挂起到后台暂停运行,执行一些别的操作,然后再用 fg 来将挂起的进程重新放回前台(也可用 bg 来将挂起的进程放在后台)继续运行。这样我们就可以在一个终端内灵活切换运行多个任务,这一点在调试代码时尤为有用。因为将代码编辑器挂起到后台再重新放回时,光标定位仍然停留在上次挂起时的位置,避免了重新定位的麻烦。

  •  
  •  
  •  

&

 

&
&&
&
&&

 
  

  •  
  •  
  •  
  •  
 
  

&

&




    

&

             


DBA笔试面试讲解
欢迎与我联系



相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
1月前
|
Linux 网络安全 数据安全/隐私保护
Linux 超级强大的十六进制 dump 工具:XXD 命令,我教你应该如何使用!
在 Linux 系统中,xxd 命令是一个强大的十六进制 dump 工具,可以将文件或数据以十六进制和 ASCII 字符形式显示,帮助用户深入了解和分析数据。本文详细介绍了 xxd 命令的基本用法、高级功能及实际应用案例,包括查看文件内容、指定输出格式、写入文件、数据比较、数据提取、数据转换和数据加密解密等。通过掌握这些技巧,用户可以更高效地处理各种数据问题。
107 8
|
1月前
|
监控 Linux
如何检查 Linux 内存使用量是否耗尽?这 5 个命令堪称绝了!
本文介绍了在Linux系统中检查内存使用情况的5个常用命令:`free`、`top`、`vmstat`、`pidstat` 和 `/proc/meminfo` 文件,帮助用户准确监控内存状态,确保系统稳定运行。
377 6
|
20天前
|
Linux Shell
Linux 10 个“who”命令示例
Linux 10 个“who”命令示例
49 14
Linux 10 个“who”命令示例
|
9天前
|
Ubuntu Linux
Linux 各发行版安装 ping 命令指南
如何在不同 Linux 发行版(Ubuntu/Debian、CentOS/RHEL/Fedora、Arch Linux、openSUSE、Alpine Linux)上安装 `ping` 命令,详细列出各发行版的安装步骤和验证方法,帮助系统管理员和网络工程师快速排查网络问题。
78 20
|
9天前
|
网络协议 Linux 应用服务中间件
kali的常用命令汇总Linux
kali的常用命令汇总linux
34 7
|
29天前
|
Linux 数据库
Linux中第一次使用locate命令报错?????
在Linux CentOS7系统中,使用`locate`命令时出现“command not found”错误,原因是缺少`mlocate`包。解决方法是通过`yum install mlocate -y`或`apt-get install mlocate`安装该包,并执行`updatedb`更新数据库以解决后续的“can not stat”错误。
33 9
|
27天前
|
监控 网络协议 Linux
Linux netstat 命令详解
Linux netstat 命令详解
|
1月前
|
运维 监控 网络协议
运维工程师日常工作中最常用的20个Linux命令,涵盖文件操作、目录管理、权限设置、系统监控等方面
本文介绍了运维工程师日常工作中最常用的20个Linux命令,涵盖文件操作、目录管理、权限设置、系统监控等方面,旨在帮助读者提高工作效率。从基本的文件查看与编辑,到高级的网络配置与安全管理,这些命令是运维工作中的必备工具。
129 3
|
1月前
|
NoSQL Linux PHP
如何在不同操作系统上安装 Redis 服务器,包括 Linux 和 Windows 的具体步骤
本文介绍了如何在不同操作系统上安装 Redis 服务器,包括 Linux 和 Windows 的具体步骤。接着,对比了两种常用的 PHP Redis 客户端扩展:PhpRedis 和 Predis,详细说明了它们的安装方法及优缺点。最后,提供了使用 PhpRedis 和 Predis 在 PHP 中连接 Redis 服务器及进行字符串、列表、集合和哈希等数据类型的基本操作示例。
64 4
|
1月前
|
存储 运维 Linux
如何在 Linux 系统中使用 envsubst 命令替换环境变量?
`envsubst` 是 Linux 系统中用于替换文本中环境变量值的实用工具。本文分三部分介绍其工作原理、使用方法及实际应用,包括配置文件替换、脚本执行中环境变量替换和动态生成文件等场景,帮助用户高效利用 `envsubst` 进行开发和运维工作。
64 4