这里是一段防爬虫文本,请读者忽略。
本文原创首发于CSDN,作者IDYS
博客首页:https://blog.csdn.net/weixin_41633902/
本文链接:https://blog.csdn.net/weixin_41633902/article/details/108830808
未经授权,禁止转载!恶意转载,后果自负!尊重原创,远离剽窃!
nohup
介绍nohup
英文全称 no hang up
(不挂起),用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行。nohup
命令,在默认情况下(非重定向时),会输出一个名叫 nohup.out
的文件到当前目录下,如果当前目录的 nohup.out
文件不可写,输出重定向到 $HOME/nohup.out
文件中。nohup
和 & 的程序(对其发送CTRL+C)[dayuanshuai@www nohuo_test] vim echo.sh 1 #! /bin/bash2 i=13 while true4 do5 echo $i6 let i++7 sleep 38 done[dayuanshuai@www nohuo_test] chmod u+x echo.sh # 对其添加一个 执行权限
[dayuanshuai@www nohuo_test] ./echo.sh
1
2
3
4
5
6
7
8
[root@www ~] ps aux | grep echo.sh
500 2067 0.0 0.0 106076 1356 pts/0 S+ 17:54 0:00 /bin/bash ./echo.sh
root 2080 0.0 0.0 103256 880 pts/2 S+ 17:54 0:00 grep echo.sh
ctrl+c
发送中断信号。[dayuanshuai@www nohuo_test] ./echo.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
^C
[root@www ~] ps aux | grep echo.sh
root 2086 0.0 0.0 103256 876 pts/2 S+ 17:55 0:00 grep echo.sh
nohup
和 & 的程序(断开与终端的连接)A
终端里面执行死循环程序[dayuanshuai@www nohuo_test] ./echo.sh
1
2
3
4
B
终端查看其运行状态,发现程序正在运行[root@www ~] ps aux | grep echo.sh
500 2126 0.0 0.0 106076 1356 pts/0 S+ 18:04 0:00 /bin/bash ./echo.sh
root 2132 0.0 0.0 103256 880 pts/1 R+ 18:04 0:00 grep echo.sh
A
终端的连接,再次在B
终端查看程序运行状态,发现程序已经不再运行[root@www ~] ps aux | grep echo.sh
root 2136 0.0 0.0 103256 880 pts/1 S+ 18:05 0:00 grep echo.sh
[dayuanshuai@www nohuo_test] cat echo.sh
#! /bin/bash
i=1
while true
do
echo $i
let i++
sleep 3
done
A
终端使用&
后台运行程序,在程序运行输出的过程中。使用ctrl+c
是没有用的[dayuanshuai@www nohuo_test] ./echo.sh &
[1] 2186
[dayuanshuai@www nohuo_test] 1
2
3
4
5
6
7
8
9
10
^C
[dayuanshuai@www nohuo_test] 11
12
13
14
^C
[dayuanshuai@www nohuo_test] 15
16
17
18
19
20
21
22
# 你会发现 程序一直打印输出,使用 `ctrl+c`完全没有任何效果
B
终端查看后台运行状态,发现程序正在运行[root@www ~] ps aux | grep echo.sh
500 2285 0.0 0.0 106076 1360 pts/0 S 18:42 0:00 /bin/bash ./echo.sh
root 2293 0.0 0.0 103256 880 pts/2 S+ 18:42 0:00 grep echo.sh
A
终端,再次在B
终端查看程序运行状态,发现程序仍然在运行[root@www ~] ps aux | grep echo.sh
500 2285 0.0 0.0 106080 1404 ? S 18:42 0:00 /bin/bash ./echo.sh
root 2451 0.0 0.0 103256 880 pts/1 S+ 18:47 0:00 grep echo.sh
B
终端后,再ssh
连接上去。发现程序任然在运行[root@www ~] ps aux | grep echo.sh
500 2285 0.0 0.0 106080 1408 ? S 18:42 0:00 /bin/bash ./echo.sh
root 2479 0.0 0.0 103256 880 pts/1 S+ 18:49 0:00 grep echo.sh
[root@www ~] ps aux | grep echo.sh
500 2285 0.0 0.0 106080 1408 ? S 18:42 0:00 /bin/bash ./echo.sh
root 2603 0.0 0.0 103256 880 pts/2 S+ 18:51 0:00 grep echo.sh
# 使用 kill 杀死 程序
[root@www ~] kill 0 2285# 再次查看,发现程序已经 被杀死了
[root@www ~] ps aux | grep echo.sh
root 2610 0.0 0.0 103256 876 pts/2 S+ 18:51 0:00 grep echo.sh
当使用
&
时,前台是会显示程序运行的进程号的
nohup
的程序A
终端使用nohup
命令。发现使用这个命令运行程序时,会提示:nohup: ignoring input and appending output to nohup.out'
[dayuanshuai@www nohuo_test] nohup ./echo.sh
nohup: ignoring input and appending output to `nohup.out'
Ctrl+c
时,程序会直接退出[dayuanshuai@www nohuo_test] nohup ./echo.sh
nohup: ignoring input and appending output to `nohup.out'
^C
A
终端再次运行程序,然后断开ssh
连接。退出窗口。然后在B
终端查看程序运行状态。发现程序还在运行[dayuanshuai@www nohuo_test] nohup ./echo.sh
nohup: ignoring input and appending output to `nohup.out'
[root@www ~] ps aux | grep echo.sh
500 2692 0.0 0.0 106076 1360 ? S 19:01 0:00 /bin/bash ./echo.sh
root 2696 0.0 0.0 103256 880 pts/2 S+ 19:01 0:00 grep echo.sh
[root@www ~] kill -9 2692
[root@www ~] ps aux | grep echo.sh
root 2770 0.0 0.0 103256 880 pts/2 S+ 19:05 0:00 grep echo.sh
nohup.out
文件。[dayuanshuai@www ~] cat mytest/nohuo_test/nohup.out
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
*********
我们发现程序运行输出的字符全被保存在
nihup.out
文件里面
nohup
、&
的程序[dayuanshuai@www nohuo_test] nohup ./echo.sh & # 显示了 该程序的进程号
[1] 2858
[dayuanshuai@www nohuo_test] nohup: ignoring input and appending output to `nohup.out' # 同时显示了nophup的信息
ctrl+c
后,查看程序是否仍然在运行# 程序仍然在运行
[dayuanshuai@www nohuo_test] ps aux | grep echo.sh
500 2858 0.0 0.0 106076 1360 pts/0 S 21:30 0:00 /bin/bash ./echo.sh
500 2874 0.0 0.0 103256 884 pts/0 R+ 21:30 0:00 grep echo.sh
# 发现程序仍然在运行
[root@www ~] ps aux | grep echo.sh
500 2858 0.0 0.0 106076 1364 ? S 21:30 0:00 /bin/bash ./echo.sh
root 2962 0.0 0.0 103256 880 pts/2 S+ 21:34 0:00 grep echo.sh
[root@www ~] ps aux | grep echo.sh
root 2998 0.0 0.0 103256 876 pts/2 S+ 21:36 0:00 grep echo.sh
[root@www ~] ps aux | grep echo.sh
root 2998 0.0 0.0 103256 876 pts/2 S+ 21:36 0:00 grep echo.sh
&
ctrl+c
不会导致程序的结束nohup
nohup: ignoring input and appending output to nohup.out'
信息ctrl+c
会导致程序结束ssh
的连接不会导致程序结束nohup
、&
nohup: ignoring input and appending output to nohup.out'
信息CTRL+C
不会导致程序结束Screen
命令ssh
连接执行命令。或者是用ssh
传输文件时(sftp
、scp
),或者是用telnet
连接远程服务器时,我们可能会执行一些非常耗费时间的程序。然后当我们关闭窗口或者是断开连接时,这个程序就会被杀死,并没有继续执行。screen
命令用于多重视窗管理程序
GNU Screen是一款由GNU
计划开发的用于命令行终端切换的自由软件。用户可以通过该软件同时连接多个本地或远程的命令行会话,并在其间自由切换。
Screen
可以看作是窗口管理器的命令行界面版本。它提供了统一的管理多个会话的界面和相应的功能。
会话恢复
多窗口
Screen
环境下,所有的会话都独立的运行,并拥有各自的编号、输入、输出和窗口缓存。用户可以通过快捷键在不同的窗口下切换,并可以自由的重定向各个窗口的输入和输出。Screen
实现了基本的文本操作,如复制粘贴等;还提供了类似滚动条的功能,可以查看窗口状况的历史记录。窗口还可以被分区和命名,还可以监视后台窗口的活动。会话共享
Screen
可以让一个或多个用户从不同终端多次登录一个会话,并共享会话的所有特性(比如可以看到完全相同的输出)。它同时提供了窗口访问权限的机制,可以对窗口进行密码保护。Screen
语法screen [-AmRvx -ls -wipe][-d <作业名称>][-h <行数>][-r <作业名称>][-s <shell>][-S <作业名称>]
参数 | 含义 |
---|---|
-A | 将所有的视窗都调整为目前终端机的大小 |
-d <作业名称> | 将指定的screen 作业离线。 |
-h <行数> | 指定视窗的缓冲区行数。 |
-m | 即使目前已在作业中的screen 作业&#xff0c;仍强制建立新的screen作业 |
-r <作业名称> | 恢复离线的screen 作业。 |
-R | 先试图恢复离线的作业。若找不到离线的作业&#xff0c;即建立新的screen 作业。 |
-s | 指定建立新视窗时&#xff0c;所要执行的shell |
-S <作业名称> | 指定screen作业的名称 |
-v | 显示版本信息。 |
-x | 恢复之前离线的screen 作业 |
-ls 或-list | 显示目前所有的screen 作业 |
-wipe | 检查目前所有的screen 作业&#xff0c;并删除已经无法使用的screen 作业 |
screen
常用参数命令 | 含义 |
---|---|
screen -S yourname | 新建一个叫yourname 的session |
screen -ls | 列出当前所有的session |
screen -r yourname | 回到yourname 这个session |
screen -d yourname | 远程detach 某个session |
screen -d -r yourname | 结束当前session 并回到yourname 这个session |
screen session
下的的快捷键组合&#xff0c;在每个screen session
下&#xff0c;所有命令都以ctrl&#43;a(C-a)
开始快捷键 | 含义 |
---|---|
Ctrl&#43;a ? | 显示所有键绑定信息 |
Ctrl&#43;a c | 创建一个新的运行shell的窗口并切换到该窗口 |
Ctrl&#43;a n | Next &#xff0c;切换到下一个 window |
Ctrl&#43;a p | Previous &#xff0c;切换到前一个 Window |
Ctrl&#43;a 0..9 | 切换到第 0..9 个 window |
Ctrl&#43;a [Space] | 由视窗0 循序切换到视窗9 |
Ctrl&#43;a Ctrl&#43;a | 在两个最近使用的 window 间切换 |
Ctrl&#43;a x | 锁住当前的 window &#xff0c;需用用户密码解锁 |
Ctrl&#43;a d | detach &#xff0c;暂时离开当前session &#xff0c;将目前的 screen session (可能含有多个 windows ) 丢到后台执行&#xff0c;并会回到还没进 screen 时的状态&#xff0c;此时在 screen session 里&#xff0c;每个 window 内运行的 process (无论是前台/后台)都在继续执行&#xff0c;即使 logout 也不影响。 |
Ctrl&#43;a z | 把当前session 放到后台执行&#xff0c;用 shell 的 fg 命令则可回去。 |
Ctrl&#43;a w | 显示所有窗口列表 |
Ctrl&#43;a t | Time &#xff0c;显示当前时间&#xff0c;和系统的 load |
Ctrl&#43;a k | kill &#xff0c;window &#xff0c;强行关闭当前的 window |
Ctrl&#43;a A | 为当前窗口重新命名 |
copy mode
模式的快捷选项Ctrl&#43;a [ | 进入copy mode &#xff0c;在 copy mode 下可以回滚、搜索、复制就像用使用 vi 一样 |
---|---|
Ctrl&#43;b | Backward &#xff0c;PageUp |
Ctrl&#43;f | Forward &#xff0c;PageDown |
H(大写) High | 将光标移至左上角 |
L Low | 将光标移至左下角 |
0 | 移到行首 |
$ | 行末 |
w | forward one word &#xff0c;以字为单位往前移 |
b | backward one word &#xff0c;以字为单位往后移 |
Space | 第一次按为标记区起点&#xff0c;第二次按为终点 |
Esc | 结束copy mode |
Ctrl&#43;a ] | Paste &#xff0c;把刚刚在 copy mode 选定的内容贴上 |
Screen
[root&#64;www ~] yum -y install screen
Loaded plugins: fastestmirror
Setting up Install Process
Loading mirror speeds from cached hostfile
# 查询是否安装成功
[root&#64;www ~] rpm -q screen
screen-4.0.3-19.el6.x86_64
screen
会话[root&#64;www ~] screen -S cmd1
[root&#64;www ~]#
screen
窗口[root&#64;www ~]# screen -ls
There is a screen on:1756.cmd1 (Attached)
1 Socket in /var/run/screen/S-root.
screen
窗口数量[root&#64;www ~]# screen -S myedit
[root&#64;www ~]# screen -ls
There are screens on:1785.myedit (Attached)1756.cmd1 (Attached)
2 Sockets in /var/run/screen/S-root.
ctrl&#43;a
w
&#xff0c;查看当前所有的窗口0*$ bash
Ctrl&#43;a
&#xff0c;d
[detached]
[root&#64;www ~] screen -ls
There are screens on:1785.myedit (Attached)1756.cmd1 (Detached)1810.ME (Attached)
3 Sockets in /var/run/screen/S-root.[root&#64;www ~] screen -r 1756
[root&#64;www ~]# screen -ls
There are screens on:1785.myedit (Attached)1756.cmd1 (Attached)1810.ME (Attached)
attach
&#xff0c;那么我们想进入某个窗口&#xff0c;可以先screen -d
这个窗口&#xff0c;再screen -r
这个窗口的名字或者它的id
[root&#64;www ~]# screen -ls
There are screens on:1785.myedit (Attached)1756.cmd1 (Attached)1810.ME (Attached)
3 Sockets in /var/run/screen/S-root.[root&#64;www ~]# screen -d 1785[root&#64;www ~]#
[root&#64;www ~]# screen -ls
There are screens on:1785.myedit (Detached)1756.cmd1 (Attached)1810.ME (Attached)
[root&#64;www ~]# screen -r 1785 [remote detached][root&#64;www ~]# screen -ls
There are screens on:1785.myedit (Attached)1756.cmd1 (Attached)1810.ME (Attached)# 查看已经连接
[root&#64;www ~]#
[root&#64;www ~]# screen -ls
There are screens on:1785.myedit (Attached)1756.cmd1 (Attached)1810.ME (Attached)
# 创建一个窗口&#xff0c;执行 echo_bb.sh
[root&#64;www ~] screen -S echodigit
[root&#64;www ~]# su - dayuanshuai
[dayuanshuai&#64;www ~] ls
a a.txt compre_test c_program moount_test mytest sh_01 sh_02 sh.tar
[dayuanshuai&#64;www ~] cd mytest/
[dayuanshuai&#64;www mytest] cd nohuo_test/
[dayuanshuai&#64;www nohuo_test] ls
echo_bb.sh echo_digit.sh echo_str.sh nohup.out
# detached 退出这个窗口
[dayuanshuai&#64;www nohuo_test] ./echo_bb.sh
bb
bb
[detached]
# 再次创建一个窗口 &#xff0c;执行 echo_str.sh
[root&#64;www ~] screen -S echostr
[root&#64;www ~]# su - dayuanshuai
# detached 退出这个窗口
[dayuanshuai&#64;www ~] ./mytest/nohuo_test/echo_str.sh
whoami
whoami
[detached]
# 再次创建一个窗口 执行 echo_digit.sh
[root&#64;www ~] screen -S echobb
[root&#64;www ~]# su - dayuanshuai
# detached 退出这个窗口
[dayuanshuai&#64;www ~] ./mytest/nohuo_test/echo_digit.sh
1
2[detached]# 查看screen窗口 运行状态
[root&#64;www ~] screen -ls
There are screens on:2140.echostr (Detached)2201.echobb (Detached)2091.echodigit (Detached)
3 Sockets in /var/run/screen/S-root.# 调出 执行 echo_bb.sh的这个窗口
[root&#64;www ~] screen -r 2091
bb
bb
bb
bb
bb
bb
bb
bb
bb
bb#
[root&#64;www ~] screen -r echostr
whoami
whoami
whoami
whoami
whoami
whoami
whoami
whoami
whoami
whoami
whoami
whoami[root&#64;www ~] screen -ls
There are screens on:2140.echostr (Detached)2201.echobb (Detached)2091.echodigit (Detached)
3 Sockets in /var/run/screen/S-root.# 调出 echostr 这个窗口
[root&#64;www ~] screen -r echostr
whoami
whoami
whoami
whoami
whoami
whoami
whoami
whoami# 查看运行状态&#xff0c;再调出 2201 这个窗口
[root&#64;www ~] screen -r 2201
174
175
176
177
178
179
180
181
182
183
184
185
186[root&#64;www ~] screen -ls
There are screens on:2140.echostr (Detached)2201.echobb (Detached)2091.echodigit (Detached)
3 Sockets in /var/run/screen/S-root.# 再调出一次发现其已经执行到 216了&#xff0c;说明程序一直在后台运行
[root&#64;www ~] screen -r 2201
208
209
210
211
212
213
214
215
216
ctrl&#43;a
k
kill
screen
会话窗口&#xff0c;那么以同样一个用户登录的终端就可以使用screen -x
可以实时看到另外一个终端的实时操作# 开启一个 screen 会话
[root&#64;www ~] screen -S mytest
[root&#64;www ~]# whoself
bash: whoself: command not found
[root&#64;www ~]# whoami
root
[root&#64;www ~]# howareyou
bash: howareyou: command not found
[root&#64;www ~]# hihi# 另外一个终端执行 screen -x 直接就可以看到 另外一个终端的实时输入
[root&#64;www ~] screen -x
[root&#64;www ~]# whoself
bash: whoself: command not found
[root&#64;www ~]# whoami
root
[root&#64;www ~]# howareyou
bash: howareyou: command not found
[root&#64;www ~]# hihi
屏幕分割
Ctrl&#43;a
S
&#xff1a;水平分割Ctrl&#43;a
X
&#xff1a;关闭当前screen
窗口Ctrl&#43;a
Q
&#xff1a;关闭其他screen
窗口C/P
操作
CTRL&#43;a
[
可以进入copy/paste
模式&#xff0c;这个模式下可以像在vi
中一样移动光标&#xff0c;并可以使用空格键设置标记。其实在这个模式下有很多类似vi
的操作&#xff0c;譬如使用/
进行搜索&#xff0c;使用y
快速标记一行&#xff0c;使用w
快速标记一个单词等。关于C/P
模式下的高级操作&#xff0c;其文档的这一部分有比较详细的说明。copy/paste buffer
中&#xff0c;并退出copy/paste
模式。在正常模式下&#xff0c;可以使用快捷键C-a ]
将储存在buffer
中的内容粘贴到当前窗口。screen
配置文件
/etc/screenrc
$HOME/.screenrc
screen
默认是以单用户模式运行的&#xff0c;你需要在配置文件中指定multiuser on
来打开多用户模式&#xff0c;通过acl*&#xff08;acladd,acldel,aclchg...&#xff09;
命令&#xff0c;你可以灵活配置其他用户访问你的screen
会话