Linux中如何让进程在后台运行

Linux中如何让进程在后台运行

在Linux中,如果要让进程在后台运行,一般情况下,我们在命令后面加上&即可,实际上,这样是将命令放入到一个作业队列中了:

$ ./test.sh &
[1] 17208

$ jobs -l
[1]+ 17208 Running                 ./test.sh &

对于已经在前台执行的命令,也可以重新放到后台执行,首先按ctrl+z暂停已经运行的进程,然后使用bg命令将停止的作业放到后台运行:

$ ./test.sh
[1]+  Stopped                 ./test.sh

$ bg %1
[1]+ ./test.sh &

$ jobs -l
[1]+ 22794 Running                 ./test.sh &

[继续阅读全文]

Linux中如何将文件dump成16进制值

linux中有多种方式可以将文件dump成16进制显示,也可以将16进制值再反向成文件。

$ hexdump test.txt
0000000 524f 2d41 3030 3036 0a30 524f 2d41 3030
0000010 3630 0a30                             
0000014

$ od -x test.txt
0000000 524f 2d41 3030 3036 0a30 524f 2d41 3030
0000020 3630 0a30
0000024

$ xxd test.txt
0000000: 4f52 412d 3030 3630 300a 4f52 412d 3030  ORA-00600.ORA-00
0000010: 3036 300a                     060.

注意到hexdumpod出来的结果都是按实际存储的字节序,因为基于x86的linux是little-endian的,也就是高低字节是颠倒了的。但是xxd的结果是将字节序调整过了的。而IBM的Power CPU是big-endian的,所以在AIX上od的结果如下:

$od -x test.txt
0000000  4f52 412d 3030 3630 300a 4f52 412d 3030
0000020  3036 300a
0000024

xxd还可以实现从16进制反向生成文件,只需要加上-r选现即可。

xxd test.txt | xxd -r
ORA-00600
ORA-00060

$ echo 0000000: 4f52 412d 3030 3630 300a 4f52 412d 3030 | xxd -r
ORA-00600
ORA-00

但是要注意xxd接受的是big-endian格式的16进制值,如果输入的是little-endian的,则生成的文件字符(包括换行符)是两两颠倒的。

$ od -x test.txt | xxd -r
RO-A0006
0RO-A0060
0

vi编辑器中可以使用:%!xxd 调用xxd来将文件转换成16机制编辑模式,编辑完成后再调用:%!xxd -r转换文件模式,从而使得vi具有16进制编辑的功能,:%!其实就是调用外部shell命令,需要注意的是xxd的字节序是big-endian的,不要搞错了。

如果你的Linux系统中找不到xxd命令,那么检查下是否有安装vim-common

rpm -qa | grep vim
vim-enhanced-6.3.046-0.40E.7
vim-X11-6.3.046-0.40E.7
vim-minimal-6.3.046-0.40E.7
vim-common-6.3.046-0.40E.7

Redhat Linux如何设置用户默认属性

和Oracle的profile类似,在Redhat Linux新建一个用户或组,有很多默认继承的属性,比如密码过期时间,密码最短长度,UID/GID的范围等。这些属性是通过文件/etc/login.defs获得的,所以可以通过修改该文件改变后续所有新建用户的默认设置。

一些主要的属性包括:

MAIL_DIR        /var/spool/mail

PASS_MAX_DAYS   99999
PASS_MIN_DAYS   0
PASS_MIN_LEN    5
PASS_WARN_AGE   7

UID_MIN                   500
UID_MAX                 60000

GID_MIN                   500
GID_MAX                 60000

CREATE_HOME     yes

更多的设置及其详细说明,参考man login.defs

Oracle10.2.0.4 Linux64版本监听存在多个子进程

Update:还是被这个监听搞了一回,即使加了SUBSCRIBE_FOR_NODE_DOWN_EVENT_ =OFF。连续两天出现swap和load过高导致数据库无法提供服务,甚至OS都无法登陆。在ps后发现有两个监听进程,kill后系统恢复正常。按照Oracle的建议,删除了ONS的配置文件$ORACLE_HOME/opmn/conf/ons.config,暂时看起来正常了

连续两台全新安装的Linux64+Oracle10.2.0.4的环境,启动listener后,都出现了4个进程:

more /etc/issue
Red Hat Enterprise Linux AS release 4 (Nahant Update 5)
Kernel \r on an \m
ps -ef | grep tns
oracle    3244     1  0 09:37 ?        00:00:00 /u01/oracle/product/10.2/bin/tnslsnr listener_stb -inherit
oracle    3245  3244  0 09:37 ?        00:00:00 /u01/oracle/product/10.2/bin/tnslsnr listener_stb -inherit
oracle    3246  3245  0 09:37 ?        00:00:00 /u01/oracle/product/10.2/bin/tnslsnr listener_stb -inherit
oracle    3247  3245  0 09:37 ?        00:00:00 /u01/oracle/product/10.2/bin/tnslsnr listener_stb -inherit
oracle    5841  5504  0 10:12 pts/2    00:00:00 grep tns

之前一台Linux32位平台从9i升级上来的没有这个问题,一套Linux64平台从10.2.0.3升级上来的RAC也没有这个问题。在10.2.0.3之前,曾经有一个bug 4518443,listener可能产生一个或者多个子进程,最终导致监听hang住无法提供服务。这回到好,一启动直接就开4个进程。Oracle在10.2.0.3版中加入了4518443的patch,应该是屏蔽了某段代码,而看来到10.2.0.4他们认为这段问题代码找到了解决方法,又加了进来,结果在Linux64平台上问题更严重了,faint。

通过Bug 4518443提供的workaround可以暂时屏蔽该问题, 在listener.ora中加入:

SUBSCRIBE_FOR_NODE_DOWN_EVENT_<listener_name>=OFF

按照metalink的说法,这个语句关闭了监听自动向ONS(Oracle Notification Services)注册,正是这个注册可能导致监听启动子进程。ONS是RAC中的一个组件,禁用该特性将导致RAC的FAN(Fast Application Notification)特性不可用。还好我这里两台都是单机,这么解决应该没什么问题。

Bug啊,总是来了又走,走了又来,就像移动联通电信,分了又合,合了又分,呵呵。