一、使用场景

如果要自己的应用程序能够外网访问,比较常用的操作就是将服务部署到服务器(也可以本机使用 花生壳/ngrok 等内网穿透工具,让服务能够被外网访问)。部署服务登陆服务器会经常会用到xshell等终端工具,执行shell命令部署服务到linux机器上。可能会经常遇到应用程序日志在终端屏幕输出,关闭终端或者Ctrl+c程序就会终止运行。这时候就需要程序能够后台方式运行,并将终端输出的内容重定向到指定的文件,查看服务日志可以通过使用more/less等命令查看内容,分析服务运行状态。

二、程序后台命令方式

这里将常用的可以后台运行的方式列举出来:

1.nohup
  nohup的作用是让提交的命令忽略 hangup 信号。

格式:nohup command args

eg:

 nohup ./main > /tmp/webcrawler.log  2>&1 &

mian 是自己服务器上可以运行的go 二进制文件,>  /tmp//webcrawler.log 是将标准输出重定向到此目录下的webcrawler.log文件中,2>&1表示标准错误也输出到文件中,最后一个 & 表示加到后台(脱离终端会终止,加上nohup则不会)

2.disown
    如果有运行的程序未放进后台运行,可以尝试下面的方式。

ctrl+z  # 将程序挂起
jobs # 查看作业号
bg job_id  # 放到后台运行
disown -h %job_id

3.screen
  Screen是一款由GNU计划开发的用于命令行终端切换的自由软件。用户可以通过该软件同时连接多个本地或远程的命令行会话,并在其间自由切换 。使用screen后其是是 init(PID为1)的子进程,不会受到HUP信号的影响。

screen [-AmRvx -ls -wipe][-d <作业名称>][-h <行数>][-r <作业名称>][-s ][-S <作业名称>]

-A  将所有的视窗都调整为目前终端机的大小。
-d <作业名称>  将指定的screen作业离线。
-h <行数>  指定视窗的缓冲区行数。
-m  即使目前已在作业中的screen作业,仍强制建立新的screen作业。
-r <作业名称>  恢复离线的screen作业。
-R  先试图恢复离线的作业。若找不到离线的作业,即建立新的screen作业。
-s  指定建立新视窗时,所要执行的shell。
-S <作业名称>  指定screen作业的名称。
-v  显示版本信息。
-x  恢复之前离线的screen作业。
-ls或--list  显示目前所有的screen作业。
-wipe  检查目前所有的screen作业,并删除已经无法使用的screen作业。

 常见用法
screen -S name -> 新建一个叫name的session
screen -dms name ->创建一个detach的session
screen -ls -> 列出当前所有的session
screen -r name -> 回到name这个session
screen -d name -> 远程detach某个session # CTRL-a d快捷键终端当前Session
screen -d -r name -> 结束当前session并回到name这个session

4.setsid
  属于第二种策略,进程不属于接受 HUP 信号的终端的子进程,那么自然也就不会受到 HUP 信号的影响。

setsid  # set session id
Usage:
setsid [options] <program> [arguments ...]

Run a program in a new session.

Options:
 -c, --ctty     set the controlling terminal to the current one
 -w, --wait     wait program to exit, and use the same return
 -h, --help     display this help and exit
 -V, --version  output version information and exit

三、后台运行时常用到的任务管理命令

1.jobs

查看任务,返回任务编号n和进程号。
   jobs -l 选项 可显示所有任务的PID,jobs的状态可以是running, stopped, Terminated。但是如果任务被终止了(kill),shell 从当前的shell环境已知的列表中删除任务的进程标识。

2.bg  %n   

将编号为n的任务转后台运行

3.fg  %n   

将编号为n的任务转前台运行

4.ctrl+z    

挂起当前任务

5.ctrl+c    

结束当前任务

四、标准输出和错误输出(后台运行程序基本会涉及到)

shell中可能经常能看到:1>/dev/null  2>&1

eg:

 sudo kill -9 `ps -elf |grep -v grep|grep $1|awk '{print $4}'` 1>/dev/null 2>/dev/null

命令的结果可以通过%>的形式来定义输出

/dev/null 代表空设备文件
> 代表重定向到哪里,例如:echo "123" > /home/123.txt
1 表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于"1>/dev/null"
2 表示stderr标准错误
& 表示等同于的意思,2>&1,表示2的输出重定向等同于1
那么本文标题的语句:
1>/dev/null 首先表示标准输出重定向到空设备文件,也就是不输出任何信息到终端,说白了就是不显示任何信息。
2>&1 接着,标准错误输出重定向等同于标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。

脚本只使用标准输入、标准输出和标准错误
     Shell会自动为我们打开和关闭0、1、2这三个文件描述符,我们不需要显式地打开或关闭它们。标准输入是命令的输入,默认指向键盘;标准输出是命令的输出,默认指向屏幕;标准错误是命令错误信息的输出,默认指向屏幕。
    如果没有显式地进行重定向,命令通过文件描述符0从屏幕读取输入,通过文件描述符1和2将输出和错误信息输出到屏幕。但如果我们想从其他文件(再次强调,I/O设备在Unix/Linux中也是文件)读取输入或产生输出,就需要对0、1、2使用重定向了。其语法如下:

command < filename                   把标准输入重定向到filename文件中
command 0< filename                  把标准输入重定向到filename文件中command > filename                   把标准输出重定向到filename文件中(覆盖)
command 1> fielname                  把标准输出重定向到filename文件中(覆盖)command >> filename                  把标准输出重定向到filename文件中(追加)
command 1>> filename                 把标准输出重定向到filename文件中(追加)command 2> filename                  把标准错误重定向到filename文件中(覆盖)
command 2>> filename                 把标准输出重定向到filename文件中(追加)command > filename 2>&1              把标准输出和标准错误一起重定向到filename文件中(覆盖)
command >> filename 2>&1             把标准输出和标准错误一起重定向到filename文件中(追加)command < filename >filename2        把标准输入重定向到filename文件中,把标准输出重定向到filename2文件中
command 0< filename 1> filename2     把标准输入重定向到filename文件中,把标准输出重定向到 filename2文件中

重定向的使用有如下规律:
1)标准输入0、输出1、错误2需要分别重定向,一个重定向只能改变它们中的一个。
2)标准输入0和标准输出1可以省略。(当其出现重定向符号左侧时)
3)文件描述符在重定向符号左侧时直接写即可,在右侧时前面加&。
4)文件描述符与重定向符号之间不能有空格!

1. 标准输入的控制
语法:命令< 文件将文件做为命令的输入。
例如:

mail -s “mail test” wesongzhou@hotmail.com < file1 

将文件file1 当做信件的内容,主题名称为mail test,送给收信人。
2. 标准输出的控制
语法:命令> 文件将命令的执行结果送至指定的文件中。
例如:

ls -l > list 

将执行“ls -l”  命令的结果写入文件list 中。

语法:命令>! 文件将命令的执行结果送至指定的文件中,若文件已经存在,则覆盖。
例如:

ls -lg >! list 

将执行“ls - lg” 命令的结果覆盖写入文件list 中。

语法:命令>& 文件将命令执行时屏幕上所产生的任何信息写入指定的文件中。
例如:

cc file1.c >& error 

将编译file1.c 文件时所产生的任何信息写入文件error 中。

语法:命令>> 文件将命令执行的结果附加到指定的文件中。
例如:

ls - lag >> list 

将执行“ls - lag” 命令的结果附加到文件list 中。

语法:命令>>& 文件将命令执行时屏幕上所产生的任何信息附加到指定的文件中。
例如:
cc file2.c >>& error

ls - lag >> list 

将编译file2.c 文件时屏幕所产生的任何信息附加到文件error 中。

3)关于输入、输出和错误输出
       在字符终端环境中,标准输入/标准输出的概念很好理解。输入即指对一个应用程序或命令的输入,无论是从键盘输入还是从别的文件输入;输出即指应用程序或命令产生的一些信息;与 Windows 系统下不同的是,Linux 系统下还有一个标准错误输出的概念,这个概念主要是为程序调试和系统维护目的而设置的,错误输出于标准输出分开可以让一些高级的错误信息不干扰正常的输出信息,从而方便一般用户的使用。
       在 Linux 系统中:标准输入(stdin)默认为键盘输入;标准输出(stdout)默认为屏幕输出;标准错误输出(stderr)默认也是输出到屏幕(上面的 std 表示 standard)。在 BASH 中使用这些概念时一般将标准输出表示为 1,将标准错误输出表示为 2。下面我们举例来说明如何使用他们,特别是标准输出和标准错误输出。
      输入、输出及标准错误输出主要用于 I/O 的重定向,就是说需要改变他们的默认设置。

例如:

ls > ls_result
ls -l >> ls_result

上面这两个命令分别将 ls 命令的结果输出重定向到 ls_result 文件中和追加到 ls_result 文件中,而不是输出到屏幕上。">"就是输出(标准输出和标准错误输出)重定向的代表符号,连续两个 ">" 符号,即 ">>" 则表示不清除原来的而追加输出。下面再来看一个稍微复杂的例子:

 find /home -name lost* 2> err_result

这个命令在 ">" 符号之前多了一个 "2","2>" 表示将标准错误输出重定向。由于 /home 目录下有些目录由于权限限制不能访问,因此会产生一些标准错误输出被存放在 err_result 文件中。可以设想一下 find /home -name lost* 2>>err_result 命令会产生什么结果?
      如果直接执行 find /home -name lost* > all_result ,其结果是只有标准输出被存入 all_result 文件中,要想让标准错误输出和标准输入一样都被存入到文件中,那该怎么办呢?看下面这个例子:

 find /home -name lost* > all_result 2>& 1

上面这个例子中将首先将标准错误输出也重定向到标准输出中再将标准输出重定向到 all_result 这个文件中。这样我们就可以将所有的输出都存储到文件中了。为实现上述功能,还有一种简便的写法如下:

find /home -name lost* >& all_result

如果那些出错信息并不重要,下面这个命令可以避开众多无用出错信息的干扰:

find /home -name lost* 2> /dev/null

可以自己试验一下如下几种重定向方式:

find /home -name lost* > all_result 1>& 2
find /home -name lost* 2> all_result 1>& 2
find /home -name lost* 2>& 1 > all_result

另外一个非常有用的重定向操作符是 "-"

例如:

(cd /source/directory && tar cf - . ) | (cd /dest/directory && tar xvfp -)

该命令表示把 /source/directory 目录下的所有文件通过压缩和解压,快速的全部移动到 /dest/directory 目录下去,这个命令在 /source/directory 和 /dest/directory 不处在同一个文件系统下时将显示出特别的优势。
下面还几种不常见的用法:
n<&- 表示将 n 号输入关闭
<&- 表示关闭标准输入(键盘)
n>&- 表示将 n 号输出关闭
>&- 表示将标准输出关闭 
 
例子:

make >& compile.log 

将编译u-boot时屏幕产生的所有信息重定向到compile.log文件中;

make > compile.log 2>&1

首先将标准错误输出也重定向到标准输出中,再将标准输出重定向到 compile.log 这个文件中。这样我们就可以将所有的输出都存储到文件中了。

make  2> compile.log

将标准出错输出信息写入compile.log,但标准输出则在屏幕上显示。此时屏幕上不显示编译时的错误信息,这些信息将写入compile.log中;

make  1> compile.log  

将标准输出信息写入compile.log,但标准出错输出则在屏幕上显示。此时屏幕上不显示编译时的正确信息,这些信息将写入compile.log中。

echo "pls enter the para" >&2

把你的错误交给标准错误

linux如何后台执行程序?相关推荐

  1. 高效管理 Linux 进程:如何后台执行程序、查看进程、终止任务

    目录 前言 一.nohup命令详解 1-1.nohup命令介绍 1-2.语法格式 1-2-1.基础语法介绍 1-2-2.执行脚本文件 1-2-3.执行python文件 1-2-4.拓展延申:在服务器上 ...

  2. Linux在后台运行python程序、脚本程序、可执行程序等,关闭终端仍可保持程序运行

    欢迎大家关注笔者,你的关注是我持续更博的最大动力 原创文章,转载告知,盗版必究 Linux在后台运行python程序.脚本程序.可执行程序等,关闭终端仍可保持程序运行 文章目录: 1 为什么需要后台运 ...

  3. linux 启动后台服务 nohup

    linux的nohup命令的用法. 在应用Unix/Linux时,我们一般想让某个程序在后台运行,于是我们将常会用 & 在程序结尾来让程序自动运行.比如我们要运行mysql在后台: /usr/ ...

  4. xshell怎么让程序后台运行_使程序在Linux下后台运行

    我们计算的程序都是周期很长的,通常要几个小时甚至一个星期.我们用的环境是用putty远程连接到日本Linux服务器.所以使程序在后台跑有以下三个好处: 1:我们这边是否关机不影响日本那边的程序运行.( ...

  5. Linux 进程后台运行

    Linux 进程后台运行 1.进程在当前终端后台运行.(关闭终端后进程自动退出) sh test.sh &注:运行进程后跟 "&" 2.进程长期后台运行不受终端关闭 ...

  6. linux脚本输出缓存上限,关于 Linux 下后台执行 Python 脚本的缓冲问题

    [问题简述] 在 Linux 下后台执行 Python 脚本,重定向到日志文件,日志文件迟迟没有内容. [方案一](测试有效)nohup python3 -u t.py &> log.l ...

  7. 用以促学——Linux进程后台运行的原理、方法、比较及其实现

    用以促学--Linux进程后台运行的原理.方法.比较及其实现 文章目录 用以促学--Linux进程后台运行的原理.方法.比较及其实现 前言 相关基础知识 应用场景 问题所在 linux概念说明 ses ...

  8. 使程序在Linux下后台运行

    一.为什么要使程序在后台执行 我们计算的程序都是周期很长的,通常要几个小时甚至一个星期.我们用的环境是用putty远程连接到日本Linux服务器.所以使程序在后台跑有以下三个好处: 1:我们这边是否关 ...

  9. Linux 下后台运行程序,查看和关闭后台运行程序(转载)

    1.运行.sh文件 直接用./sh 文件就可以运行,但是如果想后台运行,即使关闭当前的终端也可以运行的话,需要nohup命令和&命令. (1)&命令 功能:加在一个命令的最后,可以把这 ...

  10. Linux执行后台work相关

    Linux的后台运行.关闭.查看后台任务 & ctrl+z jobs fg bg kill nohup setsid disown screen 1.& 加在命令的最后,可以把命令放到 ...

最新文章

  1. python3爬虫入门教程-python3爬虫入门程序
  2. 【模块】脉搏血氧仪和心率监测仪生物传感器MAX30102
  3. UML该元素的行为为基础的元素
  4. redis 缓存 key常量命名规则
  5. python各种岗位薪资_python编程语言岗位薪资真不是盖的
  6. matlab中-psi_建议收藏 | 生物信息学中的可变剪切,这些内容你了解吗?
  7. Linux 命令行 Tricks
  8. 土豆服务器延期修复,DNF更新推迟, 土豆服务器发霉了?
  9. thinkpad t420设备管理器没有蓝牙
  10. XUL透明异形旋转窗体
  11. java 图片 变黑_JAVA 压缩图片导致背景变黑
  12. uniapp中canvas将矩形图片绘制成圆形图片以及保存canvas到手机
  13. 单芯片无线供电IC 无线充电芯片 无线输电芯片FS68001
  14. 有意思的shell命令行提示符
  15. 短期突击面试攻略,收offer如砍瓜切菜!!!
  16. mac safari无法打开网页_苹果手机浏览器打不开网页怎么办?Safari无法打开网页的解决方法...
  17. linux桌面环境调整时钟,小技巧:Linux个性化面版时钟显示
  18. 操作系统-------用P,V操作解决生产者和消费者问题(详解!!!)
  19. 华硕顽石第四代FL5900u拆机换电池
  20. 嵌入式Linux驱动笔记(十四)------详解clock时钟(CCF)框架及clk_get函数

热门文章

  1. JAVA Future类的使用详解
  2. 我的世界服务器显示文字,我的世界之狮子座(自编的)是我的服务器哦~只有文字...
  3. POJ3764 The xor-longest Path
  4. 中国石油天然气行业供需格局及消费需求前景调查报告2021年版
  5. 计算机u盘启动进不去怎么办,U盘启动盘怎么进不了PE系统 该如何解决
  6. java字符串以什么结尾_java怎么判断一个字符串以什么结尾
  7. C++中begin、end、front、back函数的用法
  8. win10网络共享打印机设置
  9. 从数学上证明墨菲定律
  10. docker-compose文件内容见下文,报错信息:redis    | Error execut