Java操作linux脚本

来源:互联网 发布:php导出excel表格乱码 编辑:程序博客网 时间:2024/06/04 17:49

近期在实现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

https://my.oschina.net/lenglingx/blog/423495:作者解释的很清楚


我也写了下测试的流程:
 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"));}
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 脚本名 ,所有同名的脚本进程全部被杀死

           kill -9 ·ps -ef | grep '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  --》-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      
文章部分查看了点击打开链接













     














原创粉丝点击