Linux后台运行程序
有时候一些Web应用或者脚本啥的希望服务器后台运行,需要运行后关掉终端、退出登录、断开ssh不影响脚本或程序的运行。
nohup + screen
1、利用screen创建独立运行(孤儿)的会话session。
$ screen -S example1 # 创建一个名为example1的session
创建完自动进入
2、在session中利用nohup将应用挂载到后台并将输出重定向到文件
# 例如ls
$ nohup ls /home >> /tmp/ls.log 2>&1 &
3、从session暂离
Ctrl + a d # 按住Ctrl后先按a再按d。
因为他是孤儿进程,所以只要不关闭机器或者kill它,他就不会结束,当然,可以自己结束。
关于nohup
nohup 命令运行由 Command参数和 Arg参数构成,忽略(SIGHUP)信号。
nohup 是 no hang up 的缩写,意为不挂断,但没有后台运行,终端不能标准输入。结合&可挂到后台
在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中,或者 >>/dev/null 扔掉
语法:
nohup [命令]] [参数] [(其他操作) &] # &表示挂起
关于screen
1、简介
Screen是一个全屏窗口管理器,它在多个进程(通常是交互式shell)之间多路传输物理终端。每个虚拟终端提供DEC VT100终端的功能,此外,还提供ANSI X3.64(ISO 6429)和ISO 2022标准中的若干控制功能(例如,插入/删除行和支持多个字符集)。每个虚拟终端都有一个回滚历史缓冲区和一个复制粘贴机制,允许用户在窗口之间移动文本区域。当screen被调用时,它会创建一个包含shell(或指定命令)的窗口,然后就可以不打扰您了,这样您就可以像平常一样使用这个程序了。然后,您可以随时使用其他程序(包括更多shell)创建新的(全屏)窗口,关闭当前窗口,查看活动窗口列表,打开和关闭输出日志记录,在窗口之间复制文本,查看回滚历史记录,在窗口之间切换,所有的窗口都完全独立地运行它们的程序。当程序的窗口当前不可见时,甚至当整个屏幕会话与用户终端分离时,程序仍继续运行。
2、语法
$ screen [参数] [内容]
-A # 将所有的视窗都调整为目前终端机的大小。
-d <作业名称> # 将指定的screen作业离线。
-h <行数> # 指定视窗的缓冲区行数。
-m # 即使目前已在作业中的screen作业,仍强制建立新的screen作业。
-r <作业名称> # 恢复离线的screen作业。
-R # 先试图恢复离线的作业。若找不到离线的作业,即建立新的screen作业。
-s # 指定建立新视窗时,所要执行的shell。
-S <作业名称> # 指定screen作业的名称。
-v # 显示版本信息。
-x # 恢复之前离线的screen作业。
-ls # 显示目前所有的screen作业。
-wipe # 检查目前所有的screen作业,并删除已经无法使用的screen作业。
3、快捷键
在每个screen session 下,所有命令都以 ctrl+a(C-a) 开始。
Ctrl + a + | 功能 |
---|---|
? | Help,显示简单说明 |
" | 列出终端列表 |
A | 重命名终端 |
c | 创建新的终端,并切换到该终端 |
d | 暂时断开会话,但所有任务都依然执行 |
k | 关闭当前终端,并切换到下一个终端(当没终端时 退到原始shell终端) |
n | 切换到下一个终端 |
p | 切换到上一个终端 |
t | 显示当前时间,和系统的 load |
S | 新建水平线分割终端 |
Tab | 水平线切换终端 |
X | 关闭当前终端 |
+ | 扩大当前终端 |
- | 缩小当前终端 |
[Space] | 窗口切换 |
0-9 | 在0-9个终端之间切换 |
[Ctrl + a] | 最近使用的2个窗口切换 |
w | 列出终端列表 |
x | 锁住当前窗口,需用用户密码解锁 |
z | 把当前会话放到后台执行,用 shell 的 fg 命令则可回去。 |
exit | 关闭当前终端 |
:screen | 新建 screen 终端,并运行命令 |
:resize | 改变当前窗口高度为 |
:quit | 退出 screen 关闭所有 screen 终端,结束其中所有任务 |
选择模式下操作
Ctrl + a + (进入选择模式) | 选择模式下功能 |
---|---|
或 Ctrl-u | 光标上移一页 |
或 Ctrl-d | 光标下移一页 |
或 h | 光标左移一格 |
或 j | 光标下移一行 |
或 k | 光标上移一行 |
或 l | 光标右移一格 |
选择开始,选择结束 | |
退出选择模式 | |
Ctrl-a ] | 粘贴选择的内容 |
4、例:
screen -S name # 新建一个叫name的session
screen -ls # 列出当前所有的session
screen -r name # 回到name这个session
screen -d name # 远程detach某个session
screen -d -r name # 结束当前session并回到name这个session
[Ctrl + a + d] # 暂离session (回到之前的shell)