转自:http://blog.csdn.net/tianlesoftware/article/details/5675404
1. 先看2个命令执行的结果:
[oracle@hfcc-svr-newccsdb1 ~]$ ps -ef | less
UID PID PPID C STIME TTY TIME CMD
oracle 469 1 0 May28 ? 00:00:05 oraclenewccs (LOCAL=NO)
oracle 495 1 1 May28 ? 05:57:23 oraclenewccs (LOCAL=NO)
oracle 863 1 1 May28 ? 05:30:25 oraclenewccs (LOCAL=NO)
oracle 1209 1 0 May28 ? 01:19:29 oraclenewccs (LOCAL=NO)
oracle 1479 1 0 May28 ? 01:30:50 oraclenewccs (LOCAL=NO)
oracle 1583 1 0 May28 ? 01:32:50 oraclenewccs (LOCAL=NO)
oracle 2234 1 0 May28 ? 00:16:05 oraclenewccs (LOCAL=NO)
oracle 2285 1 0 May28 ? 00:17:24 oraclenewccs (LOCAL=NO)
oracle 2479 1 0 May28 ? 00:20:57 oraclenewccs (LOCAL=NO)
oracle 2891 1 0 May28 ? 00:03:55 oraclenewccs (LOCAL=NO)
oracle 3213 1 0 May28 ? 00:02:55 oraclenewccs (LOCAL=NO)
oracle 3447 1 0 May28 ? 00:03:58 oraclenewccs (LOCAL=NO)
oracle 3460 1 0 May28 ? 00:00:23 oraclenewccs (LOCAL=NO)
[oracle@hfcc-svr-newccsdb1 ~]$ ps -aux | less
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
oracle 469 0.0 0.4 10759972 320408 ? Ss May28 0:05 oraclenewccs (LOCAL=NO)
oracle 495 1.2 10.1 10762344 7505684 ? Rs May28 356:58 oraclenewccs (LOCAL=NO)
oracle 863 1.1 10.0 10762344 7455964 ? Ss May28 330:21 oraclenewccs (LOCAL=NO)
oracle 1209 0.2 7.3 10762216 5485856 ? Ss May28 79:28 oraclenewccs (LOCAL=NO)
oracle 1479 0.3 7.5 10762344 5595556 ? Ss May28 90:49 oraclenewccs (LOCAL=NO)
oracle 1583 0.3 7.6 10761216 5679140 ? Ss May28 92:50 oraclenewccs (LOCAL=NO)
oracle 2234 0.0 5.9 10762212 4398364 ? Ss May28 16:05 oraclenewccs (LOCAL=NO)
oracle 2285 0.0 5.8 10762220 4313736 ? Ss May28 17:24 oraclenewccs (LOCAL=NO)
oracle 2479 0.0 5.9 10761176 4436164 ? Ss May28 20:57 oraclenewccs (LOCAL=NO)
注:1. ps -aux 和 ps -ef 的区别是显示的选项不一样,aux 能显示进程占用的 内存 和CPU.
2. Less 可以对返回结果上下翻动
2. 我们在服务器上用sqlplus 连接数据库,在查看进程,会多出一条记录:
连接前:
[oratest@lyg ~]$ ps -ef|grep LOCAL=YES
oratest 30228 30170 0 13:49 pts/3 00:00:00 grep LOCAL=YES
连接后:
[oratest@lyg ~]$ ps -ef|grep LOCAL=YES
oratest 30283 30276 2 13:50 ? 00:00:00 oracleTESTDB (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
oratest 30287 30170 0 13:50 pts/3 00:00:00 grep LOCAL=YES
通过上面2个示例,我们可以看出区别在 LOCAL=NO 和 LOCAL=YES。
LOCAL=NO :非本地连接,即网络连接。 它是通过Listener 连接到服务器的。 客户端的应用通过客户端的监听向服务器的监听发送请求,服务器的监听接收后,在与数据库连接,执行相关操作,在把结果返回给客户端。 这是通过监听的流程。 所以在客户端需要配置监听,即配置tnsnames.ora。
LOCAL=YES:本地连接。 本地连接不走监听,所以在服务监听没有启动的情况下,通过本地的sqlplus 还是可以连上数据库的。
现在就有一个问题,假如我们在客户端通过PL/SQL developer 或者 Toad 工具连上服务器后,在执行sql 的过程中死掉了,我们只能结束程序,亦或者我们直接kill 掉toad 的进程,那么在服务器上并不会释放之间建立的监听进程。 没有释放的相关进程还是继续占用系统资源。 所以对于这些已经死掉的进程,我们可以kill 掉这些进程: kill -9 PID。不过在生产库上要慎用,要确认进程是死掉的才可以kill。
-bash-3.2$ ps -ef|grep oracleorcl
oracle 2321 1 0 20:56 ? 00:00:00 oracleorcl (LOCAL=NO)
oracle 2391 1 0 21:02 ? 00:00:00 oracleorcl (LOCAL=NO)
oracle 2442 1 0 21:06 ? 00:00:00 oracleorcl (LOCAL=NO)
oracle 2534 2416 0 21:09 pts/1 00:00:00 grep oracleorcl
-bash-3.2$ kill -9 2321
-bash-3.2$ ps -ef|grep oracleorcl
oracle 2391 1 0 21:02 ? 00:00:00 oracleorcl (LOCAL=NO)
oracle 2544 2416 0 21:10 pts/1 00:00:00 grep oracleorcl
下面脚本是kill 掉连接时间超过30分钟的网络连接的进程。 把脚本放在crontab里,定时执行即可。
kill.sh:
ps -e -o pid -o etime -o args|grep LOCAL=NO>/tmp/tmpfile
cat /tmp/tmpfile|while read LINE
do
TIME=`echo $LINE|awk '{print $2}'`
TIME=`echo $TIME|awk -F: '{print $1}'`
if [ $TIME -gt 30 ]
then
echo $LINE >> /tmp/tmpflie2
fi
done
cut -c 1-5 /tmp/tmpfile2 |xargs -t -n1 kill -9
rm -f /tmp/tmpfile
rm -f /tmp/tmpfile2