Linux 重定向 screen nohup &

输入输出重定向

重定向分为输入重定向与输出重定向。所谓的输入重定向即输入不从键盘读入,而是从文件输入或其它。

所谓的输出重定向即不输出到终端上,而是输出到文件中去或其它。

""<"表示输入重定向运算符

$ wc composer.json 
  86  159 2526 composer.json

> 是定向输出到文件,如果文件不存在,就创建文件;如果文件存在,就将其清空;一般我们备份清理日志文件的时候,就是这种方法:先备份日志,再用`>`,将日志文件清空(文件大小变成0字节);请检查您是否具有写入指定文件的权限。您可以使用chmod命令更改文件的权限。

>>这个是将输出内容追加到目标文件中。如果文件不存在,就创建文件;如果文件存在,则将新的内容追加到那个文件的末尾,该文件中的原有内容不受影响。

echo 'export PATH="/usr/local/sbin:$PATH"' >> ~/.bash_profile

用途:nohup表示永久运行。&表示后台运行(异步)在应用Unix/Linux时,我们一般想让某个程序在后台运行 该命令的一般形式为:

nohup command &

php bin/console oss:bill > /var/log/oss.log 2>&1 &

前后台进程

linux进程是区分前台进程和后台进程的。 
通常,在终端输入的命令执行的前台进程模式。如果一个命令要执行好久,就会阻塞住终端好久,不能进行其他工作,所以,我们可以把执行花费时间很长的任务使用后台进程模式运行,我们就可以在同一终端干其他事

#!/bin/bash

start_date=20210801
end_date=20210831
start_sec=`date -d "$start_date" "+%s"`
end_sec=`date -d "$end_date" "+%s"`
for(i=start_sec;i<=end_sec;i+=86400)); do
    day=$(date -d "@$i" "+%Y-%m-%d")
    php bin/console month_bill --date=$day &
done

上面的程序如果没有&,按照天执行脚本,等待执行完毕后才循环下一个,只有一个进程。加&后循环产生31个进程,不需要阻塞等待每天的脚本执行完毕。 

查看后台任务 

[root@localhost cdnjs]# jobs
[1]+  已停止               find / -name xml

前台切后台

在运行命令后,有的时候忘记了在命令之后加上‘&’符号,又不愿意停下此命令重新改写。这是可以按[ctrl+z],把当前程序切入后台。 
但是要注意此时在后台的这个程序是处于 Stopped 状态 
要继续执行的话,先使用jobs命令找出当前任务的jobId,然后按如下操作

[root@localhost cdnjs]#bg 1

后台切回前台

先使用jobs命令找出当前任务的jobId,然后按如下操作

[root@localhost cdnjs]#fg 1

在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中,除非另外指定了输出文件:

nohup command > myout.file 2>&1 &

在上面的例子中,输出被重定向到myout.file文件中。类似XShell终端输出的历史记录有一定的限制,记录过多,就会丢失掉之前的输出内容。用输出重定向能很好的解决这个问题。

shell中可能经常能看到:>/dev/null 2>&1 我们将这个命令组合:“>/dev/null 2>&1”  拆为四部分来分析下:

  1. 首先 0> 表示stdin标准输入; 1> 表示stdout标准输出; 2> 表示stderr错误输出;
  2. 符号 >  等价于 1> (系统默认为1,省略了先); 所以">/dev/null"等同于 "1>/dev/null"
  3. /dev/null 代表空设备文件
  4. & 可以理解为是"等同于"的意思,2>&1,即表示2的输出重定向等同于1。因此,>/dev/null 2>&1 也可以写成“1> /dev/null 2> &1”

nohup和&的功效。

使用&后台运行程序:

  • 结果会输出到终端

  • 使用Ctrl + C发送SIGINT信号,程序免疫

  • 关闭session发送SIGHUP信号(退出SSH连接),程序关闭

使用nohup运行程序:

  • 结果默认会输出到nohup.out

  • 使用Ctrl + C发送SIGINT信号,程序关闭

  • 关闭session发送SIGHUP信号,程序免疫

平日线上经常使用nohup和&配合来启动程序

  • 同时免疫SIGINT和SIGHUP信号

tee命令 

在输出信息的同时把信息记录到文件中

ls | tee /data/www/html/ls.log

Screen

在Screen环境下,所有的会话都独立的运行,并拥有各自的编号、输入、输出和窗口缓存。用户可以通过快捷键在不同的窗口下切换,并可以自由的重定向各个窗口的输入和输出。Screen实现了基本的文本操作,如复制粘贴等;还提供了类似滚动条的功能,可以查看窗口状况的历史记录。窗口还可以被分区和命名,还可以监视后台窗口的活动。 会话共享 Screen可以让一个或多个用户从不同终端多次登录一个会话,并共享会话的所有特性(比如可以看到完全相同的输出)。它同时提供了窗口访问权限的机制,可以对窗口进行密码保护。

$sudo apt-get intstall screen

yum install screen

screen会话默认是用进程号.终端号.主机名来命名的,如果同时打开多个会话的话,真是一头包。

切换到一个新的窗口

screen

让进程在后台执行,回到原窗口

ctrl + A + D

直接杀掉一个screen

screen  -S screenID -X quit
[root@localhost ~]# screen -ls
There is a screen on:
    41493.pyapi    (Detached)
1 Socket in /var/run/screen/S-root.

[root@localhost ~]# screen  -S 41493.pyapi -X quit
[root@localhost ~]# screen -ls
No Sockets found in /var/run/screen/S-root.

查看当前所有进程

screen -ls

回到指定进程

screen -r 41493(进程号)

screen -S my_screen_name 修改会话名称
ctrl+a k 终止当前进程

如果他的状态是Detached的,我们需要输入screen -r <screen的pid> ,来进入这个screen ,或者screen -rd <screen的名称> ;
如果他的状态是Attached的,我们就要输入 screen -d <screen的pid> ,来使他”Dettached”,然后再输入screen -r <screen的pid>,来进入这个screen。(必须先detached,否则是进入去的)。

Screen命令的常规用法:

-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 -D -r:连接一个screen进程,如果该进程是attached,就先踢掉远端用户并让他logout再连接

screen -m:如果在一个Screen进程里,用快捷键crtl+a c或者直接打screen可以创建一个新窗口,screen -m可以新建一个screen进程。

screen -dm:新建一个screen,并默认是detached模式,也就是建好之后不会连上去。

screen -p number or name:预先选择一个窗口。

Screen命令中用到的快捷键

Ctrl+a c :创建窗口

Ctrl+a w :窗口列表

Ctrl+a n :下一个窗口

Ctrl+a p :上一个窗口

Ctrl+a 0-9 :在第0个窗口和第9个窗口之间切换

Ctrl+a K(大写) :关闭当前窗口,并且切换到下一个窗口(当退出最后一个窗口时,该终端自动终止,并且退回到原始shell状态)

exit :关闭当前窗口,并且切换到下一个窗口(当退出最后一个窗口时,该终端自动终止,并且退回到原始shell状态)

Ctrl+a d :退出当前终端,返回加载screen前的shell命令状态

解决 screen 中文乱码,及screen基本用法

找到screenrc文件(通过whereis screenrc)添加以下配置

defutf8 on
defencoding utf8
encoding UTF-8 UTF-8

如何用bash脚本创建screen并向其发送命令

#先关闭screen
screen -S $screen_name -X quit
#重开detached screen
screen -dmS $screen_name

cmd=$"bash /tmp/task.sh";
screen -x -S $screen_name -p 0 -X stuff "$cmd" # 输入命令
screen -x -S $screen_name -p 0 -X stuff $'\n'  # "回车"的操作用于执行命令

#screen -x -S $screen_name -p 0 -X stuff "$cmd \n"

注意

这种方式发送的命令不能太长,否则会导致脚本卡住。如果需要发送一条很长的命令,或者连续发送许多条命令,最好单独写一个脚本,发送一个脚本命令给screen,让screen执行新的脚本。

screen设置窗口标题

caption always "%{.bW}%-w%{.rW}%n %t%{-}%+w %=%H %Y/%m/%d "

杀死所有 screen 任务

1、先看看有多少个screen
   screen -ls |awk '/Socket/'|awk '{print $1}'
2、如果有 N 个screen,关闭所有screen
   screen -ls|awk 'NR>=2&&NR<=N{print $1}'|awk '{print "screen -S "$1" -X quit"}'|sh

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
nohupscreen是在Linux系统中常用的运行后台任务的工具,它们在功能和使用方式上有一些区别。 首先,nohup是一个可以运行命令或脚本的命令。使用nohup命令可以让命令在后台运行,并且不会受到终端退出的影响。使用nohup的示例如下: ``` nohup command & ``` 其中,command是要运行的命令或脚本,&表示在后台运行。例如,要在后台运行一个名为task.sh的脚本,可以使用以下命令: ``` nohup ./task.sh & ``` nohup命令会将命令的输出信息重定向nohup.out文件中,可以通过查看该文件来获取命令的输出。 相比之下,screen是一个用于多路复用命令行界面的工具。使用screen可以在一个终端窗口中同时运行多个会话,并且可以在不同的会话之间切换。使用screen的示例如下: ``` screen -S session_name ``` 其中,session_name是会话的名称,可以根据需要指定。进入会话后,可以在其中运行命令或脚本。 要在screen会话中运行后台任务,可以先进入会话,然后使用nohup命令来运行命令或脚本。例如,要在一个名为my_session的会话中运行任务,可以按照以下步骤进行: 1. 进入my_session会话:`screen -r my_session` 2. 运行需要后台运行的命令或脚本:`nohup command &` nohup命令将任务放在后台运行,并且不受终端退出的影响。可以通过查看nohup.out文件来获取命令的输出。 总结来说,nohup适用于简单的后台任务,它可以让命令在后台运行并且不受终端退出的影响。而screen适用于需要同时运行多个会话,并且能够在会话之间切换的情况下使用nohup来运行后台任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值