2012-05-29 17:50:50 dzjq21 阅读数 343
  • - printf、scanf  CGI 文件重定向

    尹成老师,带你步入 C 语言的殿堂,讲课生动风趣、深入浅出,全套视频内容充实,整个教程以 C 语言为核心,完整精彩的演练了数据结构、算法、设计模式、数据库、大数据高并发检索、文件重定向、多线程同步、进程通讯、黑客劫持技术、网络安全、加密解密,以及各种精彩的小项目等,非常适合大家学习!帮助大家快速入门C语言,一步步的成为C语言高手。

    18703 人正在学习 去看看 尹成

nohup 加 &大家都知道是后台运行并把stdout输出到文件nohup.out中。其实&是后台运行的命令。

一般都是在linux下nohup格式:
nohup command_line
或者
nohup command_line &
这之间的差别是带&的命令行,即使terminal关闭,或者电脑死机程序依然运行(前提是你把程序递交到服务器上);
它把标准输出(STDOUT)和标准错误(STDERR)结果输出到nohup.txt文件这个看似很方便,但是当输出很大的时候,nohup.txt文件会非常大,或者多个后台命令的时候大家都会输出到nohup.txt文件,不利于查找结果和调试程序。
所以能够重定向输出会非常方便。下面要介绍标准输出,标准输入 和标准错误了。
其实我门一直都在用,只是没有注意到,
比如
>./command.sh > output
#这其中的>就是标准输出符号,其实是 1>output 的缩写
>./command.sh 2> output
#这里的2>就是将标准错误输出到output文件里。
而0< 则是标准输入了。
下面步入正题,重定向后台命令
>nohup ./command.sh > output 2>&1 &
解释:前面的nohup 和后面的&我想大家都能明白了把。
主要是中间的 2>&1的意思
这个意思是把标准错误(2)重定向到标准输出中(1),而标准输出又导入文件output里面,
所以结果是标准错误和标准输出都导入文件output里面了。
至于为什么需要将标准错误重定向到标准输出的原因,那就归结为标准错误没有缓冲区,而stdout有。
这就会导致 >output 2>output 文件output被两次打开,而stdout和stderr将会竞争覆盖,这肯定不是我门想要的.
这就是为什么有人会写成:
nohup ./command.sh >output 2>output出错的原因了

##########################
最后谈一下/dev/null文件的作用
这是一个无底洞,任何东西都可以定向到这里,但是却无法打开。
所以一般很大的stdou和stderr当你不关心的时候可以利用stdout和stderr定向到这里>./command.sh >/dev/null 2>&1
2019-10-17 09:59:29 jinping_shi 阅读数 244
  • - printf、scanf  CGI 文件重定向

    尹成老师,带你步入 C 语言的殿堂,讲课生动风趣、深入浅出,全套视频内容充实,整个教程以 C 语言为核心,完整精彩的演练了数据结构、算法、设计模式、数据库、大数据高并发检索、文件重定向、多线程同步、进程通讯、黑客劫持技术、网络安全、加密解密,以及各种精彩的小项目等,非常适合大家学习!帮助大家快速入门C语言,一步步的成为C语言高手。

    18703 人正在学习 去看看 尹成

nohup&是后台运行并把stdout输出到文件nohup.out中。其实&是后台运行的命令。

一般都是在linux下nohup格式:
nohup command_line
或者
nohup command_line &

不带&的命令是在前台运行,按下ctr+c时,任务中断。带&的命令时后台运行,即使terminal关闭,或者电脑死机程序依然运行(前提是程序已递交到服务器上)。

以上两个命令把标准输出(STDOUT)和标准错误(STDERR)结果输出到nohup.txt。但是当输出很大的时候,nohup.txt文件会非常大,或者多个后台命令的时候大家都会输出到nohup.txt文件,不利于查找结果和调试程序。
所以能够重定向输出会非常方便。下面要介绍标准输出,标准输入 和标准错误了。

其实我门一直都在用,只是没有注意到,比如

./command.sh > output

这其中的>就是标准输出符号,其实是 1>output 的缩写

./command.sh 2> output

这里的2>就是将标准错误输出到output文件里。而0<则是标准输入了。

如何重定向后台命令?

模板命令如下:

nohup ./command.sh > output 2>&1 &

nohup的作用

nohup有两个作用:

  1. 忽略所有发送给子命令的挂断(SIGHUP)信号
    所有发给command.sh的SIGHUP信号都被忽略,command.sh就不会收到SIGHUP信号。什么是SIGHUP信号呢?
    简单的理解可以是终端结束时,操作系统会发送SIGHUP信号到后台进程。

  2. 重定向子命令的标准输出(stdout)和标准错误(stderr)
    command.sh的标准输出和标准错误被重定向到nohup.out文件;如果没有使用nohup方式,则command.sh的标准输出和标准错误是复用父进程的标准输出和标准错误。

后台运行标志&

后台运行,即使terminal关闭,或者电脑死机程序依然运行(前提是程序已递交到服务器上)

2>&1

这个命令的意思是把标准错误(2)重定向到标准输出中(1),而标准输出又导入文件output里面,所以结果是标准错误和标准输出都导入文件output里面了。

至于为什么需要将标准错误重定向到标准输出的原因,那就归结为标准错误没有缓冲区,而stdout有。

这就会导致 >output 2>output 文件output被两次打开,而stdout和stderr将会竞争覆盖,这就是为什么有人会写成:
nohup ./command.sh >output 2>output出错的原因了

通常后台运行重定向可以写成:

nohup sh command.sh > logs/command.log 2>&1 &

标准错误和标准输出都会导入logs文件夹下的command.log日志文件。

/dev/null文件的作用

这是一个无底洞,任何东西都可以定向到这里,但是却无法打开。所以一般很大的stdou和stderr当你不关心的时候可以利用stdout和stderr定向到这里>./command.sh >/dev/null 2>&1

2018-05-26 10:24:56 perry_x 阅读数 2705
  • - printf、scanf  CGI 文件重定向

    尹成老师,带你步入 C 语言的殿堂,讲课生动风趣、深入浅出,全套视频内容充实,整个教程以 C 语言为核心,完整精彩的演练了数据结构、算法、设计模式、数据库、大数据高并发检索、文件重定向、多线程同步、进程通讯、黑客劫持技术、网络安全、加密解密,以及各种精彩的小项目等,非常适合大家学习!帮助大家快速入门C语言,一步步的成为C语言高手。

    18703 人正在学习 去看看 尹成

在部署.py脚本到linux服务器的时候,我们经常想把后台脚本输出(程序print)的内容存到日志里。

首先.py后台运行的2个方法:

1.  nohup

nohup python -u MainServices.py >> services.log 2>&1 &

>> services.log   为重定向追加输出log到现有services.log文件, 如果写>重定向的话是清空原文件services.log并替换log
python -u这个非常重要, 由于python有缓冲机制,print不一定会立刻输出到文件!!! 加了-u可以让stdout等强制无缓冲, 立刻输出到文件!
2>&1 将错误重定向到标准输出中(意思是都显示在一起!在一个文件里)
最后的&表明后台运行

2. screen

因为每条语句都写nohup太麻烦了!所以有了万能的screen. (screen需要你手动安装在你的OS上,但是强烈推荐这个工具!)
他的效果就是生成多个不同的子shell环境(screen session)可以运行后台作业,并且可以自由在这些单独的环境之间切换。
注意, screen其实和最著名的编辑器vim调用命令方式一样,在screen的子shell中,通过快捷键Ctrl+a进入命令模式(比如detach的命令是Ctrl+a 然后Ctrl+d)。

命令:

screen 启动新的screen session, screen -S <session name>是通过指定名字启动新screen session (推荐!!!)
ctrl+a然后ctrl+a 把当前的screen session放到后台运行,回到最开始的主shell环境
exit 彻底退出当前的screen session
screen -x 回到上一个激活的screen session
screen -ls 列出所有现在后台的screen session
screen -r <pid> 在用screen -ls列出素有screen session以及他们的进程号(pid)后 用这个命令跳转到相应的screen
screen - wipe  删掉无用的session session 
ctrl+a 然后输入:sessionname <new session name>重命名当前session。

例子:

root@vultr:  screen
root@vultr:  python -u MainServices.py >> services.log 2>&1
root@vultr:  (按下CTRL+A 然后CTRL+D退出当前screen session保持语句在后台执行) 

root@vultr:  screen -x
(screen -x 又回到刚才运行MainServices.py的screen session)

PS: 在screen session里貌似rz是不管用的.... 貌似只有退出screen才可以用rz传文件
2019-02-17 00:04:57 qq_34147021 阅读数 5808
  • - printf、scanf  CGI 文件重定向

    尹成老师,带你步入 C 语言的殿堂,讲课生动风趣、深入浅出,全套视频内容充实,整个教程以 C 语言为核心,完整精彩的演练了数据结构、算法、设计模式、数据库、大数据高并发检索、文件重定向、多线程同步、进程通讯、黑客劫持技术、网络安全、加密解密,以及各种精彩的小项目等,非常适合大家学习!帮助大家快速入门C语言,一步步的成为C语言高手。

    18703 人正在学习 去看看 尹成

一、使用场景

       如果要自己的应用程序能够外网访问,比较常用的操作就是将服务部署到服务器(也可以本机使用 花生壳/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

    把你的错误交给标准错误

 

 

2014-05-28 09:32:40 AC_huang 阅读数 8532
  • - printf、scanf  CGI 文件重定向

    尹成老师,带你步入 C 语言的殿堂,讲课生动风趣、深入浅出,全套视频内容充实,整个教程以 C 语言为核心,完整精彩的演练了数据结构、算法、设计模式、数据库、大数据高并发检索、文件重定向、多线程同步、进程通讯、黑客劫持技术、网络安全、加密解密,以及各种精彩的小项目等,非常适合大家学习!帮助大家快速入门C语言,一步步的成为C语言高手。

    18703 人正在学习 去看看 尹成

很多时间,我们希望程序后台运行,这样不会干扰我们做别的事,也可以关闭shell登录,把输出打印到文件中,方便我们看信息,这样就需要让其后台运行,先看一个运行例子


./WeightBarCode resolutionratio=640*480 samplerate=30 device=2 > log.txt  2>&1 &

后面的>log.txt 是我们输出重定向的文件名,2>&1 &表示后台运行。

小伙伴们不知道后面2 1 这类的数字代表什么意思,可以看下面的文章


Linux Shell 环境中支持输入输出重定向,用符号" <"和">"来表示。0、1和2分别表示标准输入、标准输出和标准错误信息输出,可以用来指定需要重定向的标准输入或输出,比如 2>a.txt 表示将错误信息输出到文件a.txt中。 

同时,还可以在这三个标准输入输出之间实现重定向,比如将错误信息重定向到标准输出,可以用 2>&1来实现。 

Linux下还有一个特殊的文件/dev/null,它就像一个无底洞,所有重定向到它的信息都会消失得无影无踪。这一点非常有用,当我们不需要回显程序的所有信息时,就可以将输出重定向到/dev/null。 

如果想要正常输出和错误信息都不显示,则要把标准输出和标准错误都重定向到/dev/null, 例如: 

# ls 1>/dev/null 2>/dev/null 

还有一种做法是将错误重定向到标准输出,然后再重定向到 /dev/null,例如: 

# ls >/dev/null 2>&1 

注意:此处的顺序不能更改,否则达不到想要的效果,此时先将标准输出重定向到 /dev/null,然后将标准错误重定向到标准输出,由于标准输出已经重定向到了/dev/null,因此标准错误也会重定向到/dev/null,于是一切静悄悄:-) 

另外+: 

make >& make_log 

意思是把标准输出和错误输出都重定向, make>out 只重定向标准输出!!!!! 

>log 表示把标准输出重新定向到文件log中 

>& log 表示把标准输出和错误输出都定向到文件log中,相当于 >log 2>&1

linux后台运行程序

阅读数 542

没有更多推荐了,返回首页