近期在实现Java调用linux命令及脚本实现数据的批处理,文件的生成,下面记录下我所有遇见的问题
1、sqlplus ip等配置
1.sqlplus username/password 连接本机数据库,不需要数据库服务器的listener进程ip等
2.sqlplus usernaem/password@orcl 通过网络连接,这是需要数据库服务器的listener处于监听状态。
tnsnames.ora文件,从里边找orcl的记录,并且找到数据库服务器的主机名或者IP,端口和service_name,其实就是提前配置好远程连接
3.sqlplus username/password@//host:port/sid
不需要提前配置,只需要写远程的ip,端口 和sid
例子:sqlplus -s ia_user/ia_user@//10.135.0.77:1521/ods
-s其实就是日志输出格式的设置
注意
2、Java调用shell脚本远程
RemoteShellExecutor 有很多实现demo
我的脚本:
#!/bin/bash
source /home/oracle/.bash_profile
BATC=`sqlplus -s ia_user/ia_user@//10.135.0.77:1521/ods <<EOF
set heading off;
set feedback off;
set pagesize 0;
set verify off;
set echo off;
insert into zxy_student values(2,'zxy1','s');
commit;
SELECT count(*) from zxy_student;
exit;
EOF`
echo $BATC
1.报错:
outStr=
outErr=/home/oracle/test/zxy2.sh: line 13: sqlplus: command not
0
Process finished with exit code 0
发现脚本在linux直接能执行,但是一旦用Java调用就报错,其实大多说这种情况都是环境变量的原因
只需要在脚本中加
source /home/oracle/.bash_profile
或者:source /etc/profile
主要是报错信息中有sqlplus-》oracle,看一下这两个配置文件中要有oracle的配置
export ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1
export PATH=$PATH:$ORACLE_HOME/bin
2.成功:
outStr=2
outErr=
0
3.Java传参数给shell
execcutor.exec("/home/oracle/test/zxy3.sh 3 zxy3 m")
shell接收:以$+数字的形式接收
insert into zxy_student values($1,'$2','$3');====》insert into zxy_student values(3,'zxy3','m');
4.java 调用启动流程整体测试
问题:
shell脚本a调用另一个shell脚本b的时候,在linux上执行脚本可以执行,但是用Java调用a脚本,a脚本调用b找不到文件,出现这种问题的主要原因就是默认的路径的问题
默认的执行路径是/home/oracle ,所以使用./b.sh =>/home/oracle/b.sh ,可以使用全路径
exec 执行子级的命令后,不再执行父级命令(exec /路径/b.sh)
source:
执行子级命令后继续执行父级命令,同时子级设置的环境变量会影响到父级的环境变量。
与fork的区别是不新开一个sub-shell来执行被调用的脚本,而是在同一个shell中执行. 所以被调用的脚本中声明的变量和环境变量, 都可以在主脚本中得到和使用.
(source /路径/b.sh 或者. ./路径/b.sh)
fork: 如果shell中包含执行命令,那么子命令并不影响父级的命令,在子命令执行完后再执行父级命令。子级的环境变量不会影响到父级。
fork是最普通的 (./路径/b.sh
)
:作者解释的很清楚
我也写了下测试的流程:
Java调用接口:
public static void main(String[] args) throws Exception{
RemoteShellExecutor executor = new RemoteShellExecutor("10.135.100.119", "oracle", "oracle");
System.out.println(executor.exec("/home/oracle/test/zxy/zxy1.sh"));
}
zxy.sh
其余的shell和zxy2类似
其实这几个脚本完全可以合并成一个的,这个调用有点啰嗦,主要是测试
会发现主要的zxy1.sh用的是source 其余的用的是exec:调用其他的脚本文件,如果所有的脚本中都用source,那么结果输出的控制板就会输出success!4次
如果像现在这样,success就只输出一次,主要的原因,就是exec只要调用了对应的脚本,下面的就不执行了,有点像跳出循环或者return
甚至可以利用这样的特性
将zxy2.sh中的exec行去掉
以传参或者再次查询的形式执行
5.Java停止执行脚本
java 调用linux脚本有两种,一种是通过ProcessBuilder:但是不支持远程调用shell脚本
另一种ssh-2支持远程 session.execCommand(" ")
1. 设置公用的表,每一步的执行都改变表中的值,执行每一步之前都去查询表中的值,当前想要停止程序,那就修改表中的值为已经执行过的步骤号,这种感觉不能立即停止执行,不好。
2.强制kill, zxy1.sh 脚本名 ,所有同名的脚本进程全部被杀死
zxy1.sh' | grep -v 'grep' | awk '{print $2}'·
或者 ps -ef | grep 'zxy1.sh' | grep -v 'grep'| awk '{print $2}' | xargs -I {} kill -9 {}
貌似还有更复杂的,但是暂时没有用到,后期使用再补充
补充小知识:
关于如何在linux上查看内存,cpu使用情况,以及如何查看线程进程情况。
top; 类似于windows下的任务管理器,显示的内容也很多
在第三行就看到cpu的使用情况 ,第四行就是Mem内存的使用情况,第五行Swap交换空间
top - 09:47:50 up 238 days, 14:42, 2 users, load average: 1.43, 1.32, 0.66
Tasks: 247 total, 3 running, 237 sleeping, 6 stopped, 1 zombie-----进程数等一些信息
Cpu(s): 16.9%us, 1.3%sy, 0.0%ni, 78.9%id, 2.1%wa, 0.2%hi, 0.5%si, 0.0%st
Mem: 8174388k total, 7993172k used, 181216k free, 299868k buffers
Swap: 16777208k total, 451288k used, 16325920k free, 6263972k cached
同样 free:可以看内存的使用情况
[oracle@ODSDEVDB09 ~]$ free
total used free shared buffers cached
Mem: 8174388 8125232 49156 0 193712 6504508
-/+ buffers/cache: 1427012 6747376
Swap: 16777208 459164 16318044
OS的角度来看:所以他的可用内存是49156,已用内存是8125232
应用程序角度:内存=系统free memory+buffers+cached。--》 6747376 =49156+193712+6504508
什么时候内存会被交换,以及按什么方交换。 当可用内存少于额定值的时候
查看额定值:cat /proc/meminfo
[oracle@ODSDEVDB09 ~]$ cat /proc/meminfo
MemTotal: 8174388 kB
MemFree: 68488 kB
Buffers: 85516 kB
Cached: 6629976 kB
SwapCached: 20196 kB
Active: 4612144 kB
Inactive: 3183124 kB
HighTotal: 0 kB
HighFree: 0 kB
LowTotal: 8174388 kB
LowFree: 68488 kB
SwapTotal: 16777208 kB
SwapFree: 16277284 kB
Dirty: 602528 kB
查看文件的大小 ll -h
查看进程
top 显示结果的第二部分
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
21 root 10 -5 0 0 0 S 0.3 0.0 0:16.77 events/3
2474 yiyang 25 0 347m 91m 11m S 0.3 1.2 32:48.21 hyperagent
4250 root 16 0 10256 700 604 S 0.3 0.0 121:26.30 hald-addon-stor
10727 oracle 15 0 12888 1224 824 R 0.3 0.0 0:00.17 top
1 root 15 0 10372 696 584 S 0.0 0.0 1:46.42 init
2 root RT -5 0 0 0 S 0.0 0.0 1:12.36 migration/0
3 root 34 19 0 0 0 S 0.0 0.0 0:00.19 ksoftirqd/0
4 root RT -5 0 0 0 S 0.0 0.0 2:47.98 migration/1
5 root 34 19 0 0 0 S 0.0 0.0 0:01.01 ksoftirqd/1
top 的相关命令的使用 top -u oracle
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
11036 oracle 15 0 12928 1232 832 R 0.3 0.0 0:00.03 top
1353 oracle 15 0 90152 1748 1004 S 0.0 0.0 0:00.13 sshd
1354 oracle 15 0 66200 1652 1224 S 0.0 0.0 0:00.08 bash
4892 oracle 15 0 51828 1848 1404 T 0.0 0.0 0:00.00 sftp
4893 oracle 15 0 59168 3160 2536 T 0.0 0.0 0:00.01 ssh
4970 oracle 15 0 51836 1984 1420 T 0.0 0.0 0:00.06 sftp
4971 oracle 15 0 61620 6464 2612 T 0.0 0.1 0:01.01 ssh
22318 oracle 15 0 90152 1736 1004 S 0.0 0.0 0:03.80 sshd
22319 oracle 15 0 66180 1676 1232 S 0.0 0.0 0:00.10 bash
23233 oracle 15 0 51836 1996 1424 T 0.0 0.0 0:49.84 sftp
23234 oracle 15 0 62612 7504 2612 T 0.0 0.1 11:06.34 ssh
直接输入M,进程会按MEM内存排序
按P 进程会按CPU排序
Ps查看进程 ,当前用户的进程
[oracle@ODSDEVDB09 ~]$ ps
PID TTY TIME CMD
1354 pts/1 00:00:00 bash
11608 pts/1 00:00:00 ps
ps -ax a:全部用户的进程情况
比较多可以结合管道翻页
ps -ax | less
ps -u oracle ;过滤用户
ps -aux 显示全信息:包含cpu及内存
按cpu的降序显示进程 ,按内存的升序显示进程
ps -aux --sort -pcpu 或者 ps -aux --sort +pmem
下面看一下线程:我也不知道这里面查看线程能干什么?
ps -T:能查看线程,其中sid就是线程号,因为线程依赖于进程,所以必然有对应的进程号
例如 ps -T -p 进程号:相当于查看进程对应的线程
ps -T -p 29278
PID SPID TTY TIME CMD
29278 29278 ? 00:00:00 java
29278 29279 ? 00:00:05 java
29278 29280 ? 00:00:03 java
29278 29281 ? 00:00:03 java
29278 29282 ? 00:00:03 java
29278 29283 ? 00:00:03 java
29278 29284 ? 00:00:03 java
29278 29285 ? 00:00:03 java
29278 29286 ? 00:00:03 java
29278 29287 ? 00:00:03 java
29278 29288 ? 00:08:30 java
还有就是top
top -H
top -H -p 29278
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
29278 root 20 0 1990m 667m 26m S 0.0 8.4 0:00.00 java
29279 root 15 0 1990m 667m 26m S 0.0 8.4 0:05.15 java
29280 root 15 0 1990m 667m 26m S 0.0 8.4 0:03.65 java
29281 root 15 0 1990m 667m 26m S 0.0 8.4 0:03.65 java
29282 root 15 0 1990m 667m 26m S 0.0 8.4 0:03.64 java
29283 root 15 0 1990m 667m 26m S 0.0 8.4 0:03.69 java
29284 root 15 0 1990m 667m 26m S 0.0 8.4 0:03.63 java
29285 root 15 0 1990m 667m 26m S 0.0 8.4 0:03.62 java
29286 root 15 0 1990m 667m 26m S 0.0 8.4 0:03.58 java
29287 root 15 0 1990m 667m 26m S 0.0 8.4 0:03.75 java
29288 root 15 0 1990m 667m 26m S 0.0 8.4 8:30.99 java
文章部分查看了点击打开链接