四、disown 命令 通过”后台任务”启动”守护进程”并不保险,因为有的系统的huponexit参数可能是打开的(on)。 更保险的方法是使用disown命令。 disown的用法如下。 # 移出最近一个正在执行的后台任务 $ disown # 移出所有正在执行的后台任务 $ disown -r # 移出所有后台任务 $ disown -a # 不移出后台任务,但是让它们不会收到SIGHUP 信号 $ disown -h # 根据jobId,移出指定的后台任务 $ disown %2 $ disown -h %2 五、标准 I/O 使用disown命令之后,还有一个问题。 $ node server.js & $ disown 接着,你退出 session,访问5000端口,就会发现连不上。
/hello.sh $ cat nohup.out.out ◆ 5.disown ---- 如果您没有系统 root 权限,也许这个可以解决您的问题。 该disown命令可以使任何任务从正在运行的系统日志中不列出。因此,它可以隐藏正在进行的进程以避免所有自动注销错误或信号挂断(SIGHUP)。 $ disown jobs1 $ disown jobs1 jobs2 ... jobsn 要检查任务列表,请使用-l命令。 $ disown -a 要从窗口中仅删除一个或正在运行的作业,请使用-rdiswon 的语法。 $ disown -r 对于 SSH,要在会话连接后在后台运行作业,请使用-h语法。 $ disown -h jobID $ disown -h %2 ◆ 小结 对于系统管理员来说,保持 SSH 会话和进程运行是满足客户端和完成任务的关键工作。断开连接和频繁丢失会话非常烦人和烦人。
/my_script.sh > my_script.log 2>&1 & 使用disown命令 disown命令可以将一个已经在后台运行的作业从当前的Shell作业列表中移除,这样在用户退出时,该作业也不会被发送 /my_script.sh & disown 或者可以将disown与nohup结合使用,确保程序完全脱离Shell控制: sh nohup . /my_script.sh & disown 使用setsid命令 setsid命令可以创建一个新的会话并将程序置于该会话中,确保程序与当前终端脱离关系。 sh setsid .
0x04 disown 场景: 我们已经知道,如果事先在命令前加上 nohup 或者 setsid 就可以避免 HUP 信号的影响。 解决方法: 这时想加 nohup 或者 setsid 已经为时已晚,只能通过作业调度和 disown 来解决这个问题了。 让我们来看一下 disown 的帮助信息: disown [-ar] [-h] [jobspec ...] 用disown -h jobspec来使某个作业忽略HUP信号。 用disown -ah 来使所有的作业都忽略HUP信号。 用disown -rh 来使正在运行的作业忽略HUP信号。 disown 示例1(如果提交命令时已经用“&”将命令放入后台运行,则可以直接使用“disown”) [root@pvcent107 build]# cp -r testLargeFile largeFile
导言 多种后台运行方法总结,nohup, disown, setsid, (...&), screen, tmux 问题现象 远程登录服务器时常需要长时间运行任务,由于网络不稳定或logout等因素造成连接断开 实现方式 实现进程免受终端SIGHUP信号影响的原理主要有两种: 使进程屏蔽SIGHUP信号,如nohup 使进程脱离当前终端,这样当前终端的SIGHUP信号自然不会引起进程中断,如disown,setsid 对于已经在运行的任务,nohup和setsid明显已经不适用,可通过作业调度和disown完成此目的 [root@labserver ~]# help disown disown: disown [- 当前台已经执行任务时,使用Ctrl z将当前进程挂起到后台暂停运行,使用bg %1命令使后台挂起命令继续运行,再使用disown -h %1使进程忽略SIGHUP信号。 另,使用 disown %1 也可达到相同效果,不过当前任务会从任务列表移除,但仍可以通过ps查看进程 Tips: 在我们的日常工作中,我们可以用 Ctrl z 来将当前进程挂起到后台暂停运行,执行一些别的操作
其实还是有两种方法,首先看Noup的选择参数: disown:在sh中,可以通过disown -h job名忽略 SIGHUP 信号;disown命令将移除job表中特定的job,这也意味着该job不再接受任何信号 也就是,我们可以使用disown或者Control-Z方式,在终端关闭情况下,后台运行进程。 回到这个后台进程,输入: fg %1 disown参数 如果Control+Z方法不行,我们可以使用disown参数: nohup zsh aria2Start.sh & disown [disown参数
disown 无论是nohup还是setsid都是一般性的解决方案。 除了nohup和setsid还有disown和screen,disown 能帮助我们事后补救当前已经在运行的作业,而screen主要用在大批量操作。 那就是用disown。 用disown -h jobspec来使某个作业忽略HUP信号。 用disown -ah 来使所有的作业都忽略HUP信号。 用disown -rh 来使正在运行的作业忽略HUP信号。 运行 disown 之后,会将把目标作业从作业列表中移除,我们将不能再使用jobs来查看它,但是依然能够用ps -ef查找到它。 %1 [1]+ cp -i -r testLargeFile largeFile2 & jobs [1]+ Running cp -i -r testLargeFile largeFile2 & disown
四、disown 命令 通过"后台任务"启动"守护进程"并不保险,因为有的系统的huponexit参数可能是打开的(on)。 更保险的方法是使用disown命令。 disown的用法如下。 # 移出最近一个正在执行的后台任务 $ disown # 移出所有正在执行的后台任务 $ disown -r # 移出所有后台任务 $ disown -a # 不移出后台任务,但是让它们不会收到SIGHUP 信号 $ disown -h # 根据jobId,移出指定的后台任务 $ disown %2 $ disown -h %2 五、标准 I/O 使用disown命令之后,还有一个问题。 $ node server.js & $ disown 接着,你退出 session,访问5000端口,就会发现连不上。
---- disown 我们已经知道,如果事先在命令前加上 nohup 或者 setsid 就可以避免 HUP 信号的影响。 这时想加 nohup 或者 setsid 已经为时已晚,只能通过作业调度和 disown 来解决这个问题了。 我们可以用如下方式来达成我们的目的。 用disown -ah 来使所有的作业都忽略HUP信号。 用disown -rh 来使正在运行的作业忽略HUP信号。 需要注意的是,当使用过 disown 之后,会将把目标作业从作业列表中移除,我们将不能再使用jobs来查看它,但是依然能够用ps -ef查找到它。 disown 示例1 (如果提交命令时已经用“&”将命令放入后台运行,则可以直接使用“disown”) [xgj@entel2 shells]$ cp -r testLargeFile largeFile
[root@oradb30 media]# jobs [1]+ Running scp -r Disk1/ 192.168.1.31:/u01/media/ & 4.disown -h 将这个作业忽略HUP信号 使用disown -h 将这个作业忽略HUP信号: [root@oradb30 media]# disown -h %1 [root@oradb30 media]# jobs
一个方法就是从 Shell 任务控制中移除任务,使用内建的disown: disown 如果你有很多后台任务,请在命令后面添加%+任务 ID: disown %1 通过使用jobs -l来确认任务已经从任务表中移除
0x01 问题描述 1.1 为何关闭进程 1.2 nohup 作用 0x02 简述 2.1 操作序列 2.2 样例 0x03 原理 3.1 CTRL + Z 3.2 jobs 3.3 bg 3.4 disown 使用 "bg jobnumber" 让该进程进入后台运行; 再次使用 "jobs"查看进程状态,此时进程已经进入running 状态; 使用disown命令 "disown -h %jobnumber" mylinux $ bg 1 [1]+ redis-server & mylinux $ jobs [1]+ Running redis-server & 3.4 disown disown 命令 可以将指定任务从"后台任务"列表(jobs命令的返回结果)之中移除。 -h %1 3.5 ps 当使用过 disown 之后,会将把目标作业从作业列表中移除,我们将不能再使用jobs来查看它,但是依然能够用ps -ef查找到它。
disown 但是我们经常好这样,把命令放上去了,运行了很久,突然想起来没有考虑上述问题,这该怎么办才能让它避免 HUP 信号的影响呢? 用disown -h jobspec来使某个作业忽略HUP信号。 用disown -ah 来使所有的作业都忽略HUP信号。 用disown -rh 来使正在运行的作业忽略HUP信号。 需要注意的是,当使用过 disown 之后,会将把目标作业从作业列表中移除,我们将不能再使用jobs来查看它,但是依然能够用ps -ef查找到它。 disown 示例1(如果提交命令时已经用“&”将命令放入后台运行,则可以直接使用“disown”) ? disown 示例2(如果提交命令时未使用“&”将命令放入后台运行,可使用 CTRL-z 和“bg”将其放入后台,再使用“disown”) ?
tmp & ysx@ehbio:~/test/Bigwig$ jobs [1]+ 运行中 rsync -av * ysx@46.93.19.14:/tmp & 第四步,运行disown ysx@ehbio:~/test/Bigwig$ disown -h %1 ysx@ehbio:~/test/Bigwig$ ps -auwx | grep 'rsync' ysx 18214 如果程序运行时,已加了&号,放入后台了,则只需运行jobs获得作业号,再运行disown不挂断即可。 程序作业号不一定都是1,如果之前就有程序在后台运行,作业号相应的会自加。 nohup和disown都可以使程序不挂断,可以获得一样的效果,但原理不太一致。 nohup可以使程序忽略挂断信号(SIGHUP)或者使程序脱离终端的控制,从而终端不能再对其发送挂断信号(SIGHUP); disown则是内生于shell,告诉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 ? 例如AIX的ksh,没有disown,但是可以使用nohup -p PID来获得disown同样的效果。
disown 命令用于将一个或多个后台任务从 shell 的作业控制列表中移除。 使用 disown 后,这些任务将与当前 shell 会话脱离关联,意味着任务将不再受到终端信号(如 SIGHUP,当终端关闭时)影响,任务将继续运行,即使你退出当前会话或关闭终端。 正在前台运行的任务放后台 如果你有一个在前台运行的耗时任务,并希望将其转移到后台,那么你可以: 使用 Ctrl + Z 暂停任务 使用 bg 命令,将任务移到后台继续运行 使用 disown 使任务与当前终端断开 (可选) 如果你计划要关闭终端,并且希望任务继续运行,不受终端退出的影响,那么可以执行 disown 如果你会保持终端打开直到任务完成,则不需要使用 disown 前台运行任务 time awk 'BEGIN
可以使用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 ? 例如AIX的ksh,没有disown,但是可以使用nohup -p PID来获得disown同样的效果。
可以使用disown命令: # jobs # disown -h %1 # ps -ef|grep rsync 效果与setid相同,但是disown后无法通过jobs命令查看了。
$ nohup long_running_command & 2.3 使用disown命令 disown命令用于将一个正在前台运行的任务移入后台,使其不受终端的影响。 $ long_running_command Ctrl + Z $ bg $ disown 3. 后台进程的管理 3.1 查看后台进程 使用jobs命令可以查看当前终端中运行的所有后台进程。
fg forehead 后台程序 bg background 前台程序 jobs 查看后台进程 nohup 不挂起运行程序,关闭登录窗口后程序继续运行 disown nohup sh scripts.sh & 3.2切换为非关起 disown disown命令可以从当前 shell 的作业列表中移除全部作业,也可移除指定的一到多个作业;正在运行的作业也可以移除 disown 命令该命令是 bash 内建命令,相关的帮助信息请查看 help 命令。