近期在实现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      
文章部分查看了点击打开链接

Java操作linux脚本相关推荐

  1. java jsch jar_基于Jsch实现Java操作linux服务器

    [概述] 如果大家熟悉Linux的话,一定对ssh,sftp,scp等命令非常熟悉.ssh是一个安全协议,用来在不同系统或者服务器之间进行安全连接.ssh在连接和传送的过程中会加密所有的数据.但是ss ...

  2. java操作linux命令

    java命令操作linux指令 参考 import java.io.*; public class Test{public static void main(String[] args) throws ...

  3. java操作Linux 调用shell命令,shell脚本

    1.问题 在最近做的项目当中,需要用Java调用基于python写的两个不同的模型运行并且得到实验结果: 1.在服务器上运行的文本识别模型 2.在本地Ubuntu中annacoda 虚拟环境中运行的影 ...

  4. java操作linux命令,调用ffmpeg转码视频

    最近有一个需求需要调用linux上的ffmpeg将视频转换为MP4,切片,然后保存,在了解了ffmpeg后,下一步就是如何用java调用linux命令行了 一.概述 java要执行系统命令的话,其实是 ...

  5. java 调用linux 脚本并获取返回值

    大家好,我是烤鸭: 今天分享下java 调用 shell脚本 并获取返回值. 代码实践 String cmd = "df -h"; StringBuffer sb = new St ...

  6. Java操作Linux指令,实现恢复、备份MySQL数据库

    备份数据库指令: mysqldump -h127.0.0.1 -uroot -p123456 test > d:/test.sql ---备份test数据库到 D 盘 恢复数据库指令 mysql ...

  7. java执行linux脚本 并返回其执行结果

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.i ...

  8. Java操作shell脚本

    public class Exec { private static ILogger logger = LoggerFactory.getLogger(Exec.class); public Exec ...

  9. linux 停止java服务,linux脚本启动停止java 服务

    #!/bin/sh java env export JAVA_HOME=/usr/local/java/jdk1.7.0_72 export JRE_HOME=$JAVA_HOME/jre servi ...

最新文章

  1. 创建数据库,指定数据库的字符集和编码顺序
  2. Mainfest merger failed
  3. 时间戳转化为时间格式 时间格式转为时间戳
  4. MyBatis Review——输入输出映射
  5. 无法打开文件“opencv_world410d.obj”
  6. 神策数据:从技术视角看,如何更多、更好、更快地实施A/B试验
  7. SCU3033 Destroying a Painting(最小费用最大流)
  8. pdf复制乱码_一键解决PDF转换问题,这个网站好用到爆!
  9. echarts词云图形状_词云图在自然语言中的应用,可以如此炫酷!
  10. lintcode:Search Insert Position 搜索插入位置
  11. CLM5.0模式移植篇——驴某人的自我救赎
  12. 学习笔记(03):Qt视频教程-基础实例进阶-多线程下载和断点续传
  13. Java实现多种格式上传视频资源、解析视频格式、视频截图处理
  14. 国产艾莫讯仿西门子S7-200PLC控制步进电机程序
  15. webqq机器人java_机器人之一步一步来做WebQQ机器人-(三)(登录QQ并保持在线)
  16. MBSE基于模型的系统工程
  17. c语言俩小时不挂科——全程高能,没有废话
  18. Python进行拉勾网数据爬取框架与思路
  19. Detail-revealing Deep Video Super-resolution 论文笔记
  20. 测试用例管理工具~JIRA

热门文章

  1. Android屏幕适配 px,dp,dpi及density的关系与深入理解(转载)
  2. 中文编程软件-习语言2013版 发布啦
  3. [附源码]java毕业设计-在线排课系统
  4. 解决 mac安装或者更新第三方包安装不上的问题 mac OSX pip OSError: [Errno 1] Operation not permitted
  5. matlab踩坑 自带surf 函数找不了 surf 作为函数执行
  6. 身份证二要素验证的使用场景介绍
  7. Vscode几个有趣的插件
  8. U23国足出征名单已定
  9. 未来教育计算机一本通,未来教育·全国计算机等级考试一本通:一级B(2013年考试专用)...
  10. IMPERVA --- 磁盘空间不足