`
netxdiy
  • 浏览: 714626 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

linux进程后台运行的几种方法 - nohup/setsid/&

 
阅读更多

转自:http://blog.sina.com.cn/s/blog_3e3be35e0100oi9i.html

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

nohup/setsid/&

场景:

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

linux进程后台运行的几种方法<wbr>-<wbr>nohup/setsid/&<wbr>[转载]
hangup名称的来由
在 Unix 的早期版本中,每个终端都会通过 modem 和系统通讯。当用户 logout 时,modem 就会挂断(hangup)电话。 同理,当 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文件中。一般我们可在结尾加上"&"来将命令同时放入后台运行,也可用">filename2>&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 信号的影响了。



分享到:
评论

相关推荐

    Linux nohup实现后台运行程序及查看(nohup与&)

    一般运行linux上的程序都是执行 .sh 文件(./sh文件),那如果不影响当前CMD窗口的操作,需要后台运行怎么办呢? 这时就需要借助 nohup 和 & 命令来实现。 nohup java -server -Xms128M -Xmx512M -XX:MetaspaceSize...

    Linux-nohup日志拆分

    本文将详细介绍如何在Linux环境下设置`nohup`日志的定时拆分以及清理,并提供具体的脚本和配置方法。 #### 一、Crontab简介 在Linux系统中,`crontab`是一种用于调度周期性执行任务的工具。通过编辑用户的`crontab...

    Linux技巧:让进程后台运行

    本篇文章将讨论如何让进程在后台可靠运行的几种方法,解决在 Linux 服务器上运行耗时较长的任务时遇到的问题。这些方法包括使用 nohup、setsid 以及 & 井号符号来让进程忽略 HUP 信号,从而避免中途失败。 1. nohup...

    nohup、&、setsid、fork和fg、bg究竟有啥区别?

    ,而命令行或脚本中可以通过使用命令setsid来运行程序实现。setsid帮助一个进程脱离从父进程继承而来的已打开的终端、隶属进程组和隶属的会话。  需要注意,代码中调用setsid是有条件的:即调用进程自己不能是进程...

    详解nohup /dev/null 2&1 含义的使用

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

    linux下nohup日志输出过大问题的解决方法

    Linux 是一个功能强大且广泛使用的操作系统,nohup 命令是 Linux 中的一个常用命令,用于在后台运行程序并将输出重定向到文件中。但是在使用 nohup 命令时,经常会遇到日志输出文件过大的问题,导致日志文件变得非常...

    详解nohup /dev/null 2&gt;&1 含义的使用

    总结来说,`nohup` 命令与重定向操作符的组合,如 `nohup command &gt; /dev/null 2&gt;&1 &`,是 Linux 系统中常用的技术,用于在后台运行进程并丢弃所有输出,以确保进程的持续运行不受用户交互的影响。理解这些基本概念...

    Linux中进程在后台可靠运行的方法总结

    总结起来,Linux中确保进程在后台可靠运行的方法主要包括使用nohup、setsid,以及"&"符号。nohup通过忽略HUP信号实现进程的后台运行,而setsid则通过创建新的会话使得进程不受终端影响。根据具体需求,可以选择合适...

    linux上通过sh方式启动java jar程序并做为守护进程

    在Linux系统中,Java应用程序通常以两种主要方式运行:直接通过命令行或作为守护进程(daemon)。本篇文章将深入探讨如何使用`sh`脚本来启动Java的JAR程序,并将其设置为守护进程,以便在后台持续运行,即使用户注销...

    Linux使用笔记Linux使用笔记

    - `nohup`:后台运行命令。 - `screen`:多会话终端模拟器。 - `cron`:定时任务调度。 7. **用户帐号类** - `useradd`:添加用户。 - `userdel`:删除用户。 - `passwd`:设置密码。 - `su`:切换用户。 8...

    【已解决】利用nohup使得Python Flask项目在Ubuntu系统上后台运行

    一、问题: 今天在部署Python Flask项目到线上的时候,在虚拟环境中,运行项目可以正常访问到api,但是在Xshell中,一旦Ctrl+C或者关闭ssh,他就停止了,api再也请求不到了 二、nohup 1、nohup 是 no hang up 的缩写...

    screen-4-程序员运维必备-后台运行应用-linux-64-32位.rar

    1. 资源内容:后台运行应用screen 可方便管理后台应用,告别 -d ,告别nohup 2. 使用目标:运维,后台运行应用,linux 后台运行 3. 应用场景:部署 和 测试 4. 特点:方便管理,稳定 5. 适用人群:程序员,运维 6. ...

    Linux后台运行命令

    本文将重点介绍几种常用的Linux后台运行命令,包括快捷键方式以及`cron`和`crontab`命令的详细使用方法。这两种命令主要用于设定定时任务,涉及到进程调度与管理。 #### 二、快捷键方式启动后台任务 对于简单的...

    linux后台运行m(matlab)文件

    本文介绍了如何在 Linux 系统中后台运行 MATLAB 文件,包括使用 nohup 命令和 Terminal 运行 MATLAB 文件两种方法。同时,强调了环境变量设置的重要性。后台运行 MATLAB 文件可以提高系统资源利用率和工作效率。

    nohup使用方法LINUX|CENTOS

    nohup 命令是一个常用于 Linux 和 CentOS 操作系统中的命令,它可以使得程序在后台运行,不受终端的影响。下面是 nohup 命令的使用方法和参数解释: nohup 命令的基本语法 nohup 命令的基本语法是:nohup command...

    linux命令关闭开启SVN

    - `nohup` 命令用于后台运行程序,并忽略挂断信号。 - `killall` 命令用于杀死所有匹配指定名称的进程。 - `ps -ef` 显示所有进程的信息。 - `grep` 命令用于过滤文本输出。 ### 总结 通过上述介绍,我们了解了...

    LInux系统学习资料

    - nohup和screen命令:后台运行进程,即使用户退出也会继续执行。 7. **网络配置与管理** - ifconfig/ip命令:查看和配置网络接口。 - ping/traceroute命令:测试网络连通性和追踪路径。 - ssh:安全的远程登录...

    linux命令在后台运行

    本文将详细介绍如何在Linux中让命令在后台运行,包括使用`&`、`ctrl+z`、`fg`、`jobs`等命令的具体方法,以及如何使用`nohup`命令来确保程序即使在终端关闭后也能继续运行。 #### 二、使用`&`将命令置于后台 在...

    详解linux下nohup日志输出过大问题解决方案

    在Linux系统中,`nohup`命令是一个非常实用的工具,它允许用户在退出终端后继续执行命令或脚本,通常用于运行长时间运行的任务。然而,当使用`nohup`时,日志输出可能会迅速增加,导致日志文件过大,这不仅占用大量...

Global site tag (gtag.js) - Google Analytics