LINUX 标准错误输出重定向

LINUX 标准错误输出重定向,第1张

用途:不挂断地运行命令。

语法:nohup Command [ Arg … ] [ &]

无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中。

如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。

如果没有文件能创建或打开以用于追加,那么 Command 参数指定的命令不可调用。

退出状态:该命令返回下列出口值:

126 可以查找但不能调用 Command 参数指定的命令。

127 nohup 命令发生错误或不能查找由 Command 参数指定的命令。

否则,nohup 命令的退出状态是 Command 参数指定命令的退出状态。

用途:在后台运行

一般两个一起用

3.为什么呢 2>&1 要写在后面?

首先是command >file将标准输出重定向到file中, 2>&1 是标准错误拷贝了标准输出的行为,也就是同样被重定向到file中,最终结果就是标准输出和错误都被重定向到file中。

2>&1 标准错误拷贝了标准输出的行为,但此时标准输出还是在终端。>file 后输出才被重定向到file,但标准错误仍然保持在终端。

用strace可以看到:

这个命令中实现重定向的关键系统调用序列是:

open(file) == 3

dup2(3,1)

dup2(1,2)

这个命令中实现重定向的关键系统调用序列是:

dup2(1,2)

open(file) == 3

dup2(3,1)

注意:0 是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。

这里的2和>之间不可以有空格,2>是一体的时候才表示错误输出。

 利用串口终端作为Linux控制台,可以免去额外的键盘,显示卡和显示器,同时可将Linux主机作为一个任意用途的嵌入式黑匣。那么LINUX控制台怎么定向到串口终端?下面跟着学习啦小编一起来了解一下吧。

LINUX控制台怎么定向到串口终端

目的: 台机已经装好Linux,显示器有问题,平时一般都SSH控制,当Linux网络挂的时候,想通过串口来管理。

硬件:台机自带两个串口(上面的是COM1)[under Windows] or ttyS0[under Linux)),笔记本T61p没有串口,买了个USB转串口(具体见下图)。同时需要串口交叉线一根(NULL modem Cable),母对母(公的是针),都是凹口那种。

目标机器:安装的CentOS 5.2 Linux 内核2.6.18-92.1.22.el5和2.6.18-92.1.22.el5xen

客户端: Windows XP SP3 IBM OEM. 安装USB转串口驱动。

需要把输出定向到串口,一般有下面几处:

BIOS中的设置

GRUB设置

/etc/inittab 设置

/etc/securetty 设置

BIOS中的设置

BIOS设置的作用我没尝试过,如果是可以连BIOS设置都可以定向到串口,那个强大了。也不知道如何去掉机器需要连键盘的限制。没拿出显示器所以没看我台机的BIOS,不过这个功能一般只有服务器级别的机器有。【注1】台机一般没有串口重定向功能。

GRUB设置

这里的配置是为了把grub菜单定向到串口,这样你就可以在串口 *** 作grub,选择启动项,使用single mode等等。

同时也要给kernel参数加上console选项。

[root@CentOS5 ~]# cat /boot/grub/menu.lst

# grub.conf generated by anaconda

#

# Note that you do not have to rerun grub after making changes to this file

# NOTICE: You have a /boot partition. This means that

# all kernel and initrd paths are relative to /boot/, eg.

# root (hd0,0)

# kernel /vmlinuz-version ro root=/dev/vg00/lv_root

# initrd /initrd-version.img

#boot=/dev/hdb1

serial --unit=0 --speed=9600 --word=8 --parity=no --stop=1

terminal --timeout=10 serial console

default=2

timeout=20

#splashimage=(hd0,0)/grub/splash.xpm.gz =>这些在console下会工作不正常,注释掉。

#hiddenmenu

title CentOS (2.6.18-92.1.22.el5)

root (hd0,0)

kernel /vmlinuz-2.6.18-92.1.22.el5 ro root=/dev/vg00/lv_root rhgb quiet

initrd /initrd-2.6.18-92.1.22.el5.img

title CentOS Serial[ttyS0] - Console (2.6.18-92.1.22.el5)

root (hd0,0)

kernel /vmlinuz-2.6.18-92.1.22.el5 ro root=/dev/vg00/lv_root console=ttyS0,9600 console=tty0

initrd /initrd-2.6.18-92.1.22.el5.img

title CentOS Console - serial[ttyS0] (2.6.18-92.1.22.el5) [get more output in serial console]

root (hd0,0)

kernel /vmlinuz-2.6.18-92.1.22.el5 ro root=/dev/vg00/lv_root console=tty0 console=ttyS0,9600

initrd /initrd-2.6.18-92.1.22.el5.img

title CentOS Xen (2.6.18-92.1.22.el5xen)

root (hd0,0)

kernel /xen.gz-2.6.18-92.1.22.el5

module /vmlinuz-2.6.18-92.1.22.el5xen ro root=/dev/vg00/lv_root rhgb quiet xencons=off

module /initrd-2.6.18-92.1.22.el5xen.img

title CentOS Xen Serial[ttyS0] - Console (2.6.18-92.1.22.el5xen)

root (hd0,0)

kernel /xen.gz-2.6.18-92.1.22.el5

module /vmlinuz-2.6.18-92.1.22.el5xen ro root=/dev/vg00/lv_root xencons=off console=ttyS0,9600 console=tty0

module /initrd-2.6.18-92.1.22.el5xen.img

title CentOS Xen Console - serial[ttyS0] (2.6.18-92.1.22.el5xen)

root (hd0,0)

kernel /xen.gz-2.6.18-92.1.22.el5

module /vmlinuz-2.6.18-92.1.22.el5xen ro root=/dev/vg00/lv_root xencons=off console=tty0 console=ttyS0,9600

module /initrd-2.6.18-92.1.22.el5xen.img

title Other

rootnoverify (hd0,0)

chainloader +1

后面的console有顺序关系,详见下文【注2】,我常用串口所以console=tty0 console=ttyS0,9600这个顺序的输出信息比较多。

因为我的机器有xen的内核,xen默认情况下会把串口做为xencons,所以这里设置xencons=off.

When multiple consoles are listed output is sent to all consoles and input is taken from the last listed console. The last console is the one Linux uses as the /dev/consoledevice.

/etc/inittab 设置

系统系统后,需要在串口上监听请求,所以要有个类似服务器的程序(agetty, mgetty etc)。

/etc/inittab中添加

s0:2345:respawn:/sbin/agetty -L -f /etc/issue.serial 9600 ttyS0 vt100

#s1:2345:respawn:/sbin/agetty -L -f /etc/issue.serial 9600 ttyS1 vt100

#S0:2345:respawn:/sbin/mgetty -r -x 9 ttyS0 ==>mgetty 用来调试比较好,log也丰富。

What is a getty?

A getty is is a program that opens a tty port, prompts for a login name, and runs the /bin/login command. It is normally invoked by init.

所以其他程序就不能再来占用ttyS0了,串口是独占模式的吧。

vt100:

vt100 is the terminal emulation. You can use others, but VT100 is the most common or "standard". Another widely used termial type is VT102.

OK都可以了,可以重启server了。这里如果想测试下串口线,推荐先在Linux启动下mgetty,因为他的debug信息和log比较丰富,适合排错和测试。

#mgetty –r –x 9 ttyS0

Log在/var/log/mgetty*中。

/etc/securetty设置

因为一般我们都是使用root登陆串口来维护,所以需要设置root可以在COM1和COM2登陆。

在/etc/securetty中添加:

ttyS0

ttyS1

Windows客户端连接可以用超级终端或者Putty。

注意启动server的时候,putty就应该去连接串口了,这样才可以看到所有信息。

本来正常情况下,接下去kernel的boot信息应该也会打到串口的。但是没有,确定是Xen内核的关系。

系统启动起来后,过了init,agetty就起来了,这个时候就可以通过串口登陆了。(在/etc/securetty中需要添加ttyS0)

看过“ LINUX控制台怎么定向到串口终端 ”的人还看了:

远程执行命令?

利用spawn和expect登录,send发送指令就可以了。

http://blog.sina.com.cn/s/blog_5140741f01015w3j.html

可以参考下上面的链接


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8636427.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-19
下一篇 2023-04-19

发表评论

登录后才能评论

评论列表(0条)

保存