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 &

[继续阅读全文]

AIX平台升级到Oracle10.2.0.4的几个问题

最近将AIX5306上一个Oracle从9.2.0.6升级到了10.2.0.4,虽然最终升级顺利完成,不过还是碰到了几个小问题,在这里记录一下。

1. plan_table的问题
如果在9i的sys用户下手动执行过$ORACLE_HOME/rdbms/admin/utlxplan.sql脚本建立plan_table,则升级前必须删除。否则执行完升级脚本catupgrd.sql会发现Oracle Database Packages and Types组件一直是invalid的,并且升级脚本的log中有如下错误:

118/44   PL/SQL: ORA-00904: "OTHER_XML": invalid identifier

遇到该错误后,删除plan_table重建也还来得及:

@?/rdbms/admin/utlxplan
@?/rdbms/admin/prvtspao.plb
@?/rdbms/admin/utlrp


2.lock_sga的问题

Oracle10.2.0.4在AIX平台分配共享内存的机制有了一点变化。原来9i使用lock_sga=true是正常的,但是10.2.0.4则无法启动instance,报错:

SQL> startup
ORA-27126: unable to lock shared memory segment in core
IBM AIX RISC System/6000 Error: 1: Not owner

看起来像是权限问题,但是即使给Oracle用户加system组也没有用。后来Oracle解释说需要给Oracle用户赋予两个capability:CAP_BYPASS_RAC_VMMCAP_PROPAGATE,但这两个capabilities是采用大页内存时才需要设置的,这样说10.2.0.4如果lock_sga的话,默认是要采用大页内存的。当然,大页内存的使用还需要os上设置相关参数的,如果os没有设置,oracle应该还是要采用4k的内存页。

#chuser capabilities=CAP_BYPASS_RAC_VMM,CAP_PROPAGATE oracle
#lsuser -a capabilities oracle
oracle capabilities=CAP_BYPASS_RAC_VMM,CAP_PROPAGATE

3.dba_segments和dba_free_space空间计算不一致的问题

select sum(bytes)/1024/1024/1024 from dba_data_files;

SUM(BYTES)/1024/1024/1024
-------------------------
468.554688

select sum(bytes)/1024/1024/1024 from dba_free_space;

SUM(BYTES)/1024/1024/1024
-------------------------
63.3510742

select sum(bytes)/1024/1024/1024 from dba_segments;

SUM(BYTES)/1024/1024/1024
-------------------------
381.477112

显然,468.554688-63.3510742=405.203614,这比从dba_segments算出来的总占用空间381.477112大了20多G,并且这个差距在不断拉大,每天大概相差4G左右。这个问题还在跟Oracle扯皮,不知道他们是否会承认这个是bug。

AIX虚拟内存管理机制

AIX采用了基于分页的虚拟内存机制。页面一般都是统一大小的(默认页面大小4k,当然也可以启用大页面内存支持,POWER5 芯片支持四种虚拟内存页面的大小:4KB64KB16MB 16GB),这样可以简化整个的管理算法。页面是基于整个虚拟内存地址空间分割的,一个页面最终可能映射到物理内存,也可能映射到磁盘的交换区(paging space)上。很明显,内存中的页面访问速度要快得多,但是内存大小有限,某些页面将不得不被挤出内存。淘汰页面的算法一般都是基于LRU算法的,通过ps -k可以看到AIX有一个lrud的内核守护进程,就是AIX分页替换守护进程。

AIX将所有的内存页面分成两大类型:

工作存储分页的内容都是易失性的,在磁盘上没有对应的永久存储文件数据,诸如进程数据/堆栈/共享内存/内核数据等,都是这一类的。而永久存储分页其实就是文件数据。分成这两种类型,是因为从内存中淘汰页面时,需要做不同的处理。对于工作存储分页,只要释放掉对应的内存页面(其实就是修改某些标志位)就可以了。而永久存储分页,则需要判断是否有数据修改,没有修改的话,和工作存储分页的处理一样,直接标志回收即可,如果有修改,则需要将相应的修改数据写回磁盘。

而根据缓存的文件的不同,永久存储分页又分成两种,一种就是新的jfs2文件系统和NFS文件系统的文件缓存,叫做客户端分页(Client pages)。而原来老的jfs文件系统的文件缓存页面,就是非客户端页面(Non-client pages)

上面对于分页的分类法,是根据缓存的数据类型,需要在淘汰时选择不同的处理方式。而AIX在选择哪些页面需要淘汰的时候,却是按照另外一种标准的。根据这个标准,可以将所有分页分成另外两种类型:

首先,所有的工作存储分页都是计算型分页,也就是说,Oracle的PGA/SGA等都是属于计算型分页的。而永久存储分页,则根据缓存的文件的类型,如果是可执行文件,则对应的分页是计算型的,如果是数据文件,则是非计算型的,同一个文件对应的页面,要么全部是计算型,要么全部是非计算型的。显然的,为了提供Oracle等应用的性能,假如需要淘汰页面,优先应当交换非计算型页面。

[继续阅读全文]

解决xmanager无法启动AIX的CDE桌面一例

昨天在AIX上中安装oracle9i的时候,xmanager能连上服务器,也能登陆,但之后就一直停在starting CDE environment,桌面死活出不来。检查服务器,CDE是安装了的,执行/etc/rc.dt也能顺利启动,检查dtlogin也运行正常。

最后发现,问题出在/etc/hosts上,假设主机名为test,IP地址为192.168.168.1,/etc/hosts文件中存在如下记录

192.168.168.1 test1 test

也就是这个位于test之前的test1造成了问题,去掉后桌面正常出来了。还有一个小问题,在AIX上安装9i会要求指定JDK1.3.1的位置,大多数情况下,安装程序会在$ORACLE_BASE/jre上安装一个1.1.8和1.3.1的版本,但有时也可能碰到没有安装的情况,这时可以指定系统中其他版本的JDK,比如/usr/java14,系统中是否已经安装其他版本的jdk可以通过which java来查看。

记录一下备忘。