使用 bash 脚本读取 oracle 查询的输出
Read output of an oracle query with a bash script
我正在尝试设置一个 bash 脚本,在该脚本中连接到 Oracle 实例以检查计划的各种 dba 作业,如果特定作业不是 运行ning 我需要显示一个错误信息。
这是我编写的脚本,它部分有效,该脚本仅在到达 IF 语句之前有效
#!/usr/bin/env bash
#write output of the sql query to an output file
output_file="/tmp/datatool_output.csv"
> $output_file
echo "
SET FEED OFF
SET PAGESIZE 0
SET COLSEP ,
SET linesize 100
SET TRIMSPOOL ON
SET TRIMOUT ON
SELECT JOB_NAME, STATE FROM DBA_SCHEDULER_JOBS where job_name ='run_LoadDatatoolStore';
exit" | sqlplus -s sqlplus -s "username/password@dbip:dbport/SID" >> $output_file
a_var=($(awk -F',' '{print }' $output_file | sed 's/\s//g' | xargs))
for item in ${a_var[@]}
do
val=$(echo $item | awk -F',' '{print }')
if [[ $val -eq "SCHEDULED" ]] || [[ $val -eq "RUNNING" ]] ; then
echo "OK: The job LoadDatatool is either Scheduled or in the Running state"
exit 0 # this is used for interpretation by nagios to display no alert alert
else [[ $val -eq "BLOCKED" ]]
echo "CRITICAL: The Db scheduler job LoadDatatool is in a Blocked state"
exit 2
fi
我明白了
test.sh: line 24: syntax error: unexpected end of file
当我 运行 脚本时,我们将不胜感激。
谢谢,
卡尔提克
你应该这样重写你的if
:
if [[ $val -eq "SCHEDULED" ]] || [[ $val -eq "RUNNING" ]] ; then
成为
if [[ $val = "SCHEDULED" ]] || [[ $val = "RUNNING" ]] ; then
或
if [[ $val = "SCHEDULED" || $val = "RUNNING" ]] ; then
-eq
用于比较数字,=
用于比较字符串
P.S。此外,您可以使用 sqlplus
的 SPOOL
功能来代替 sqlplus
的重定向输出
而不是这个丑陋的 echo
你可以在文件中写入 sql
并从命令行执行它,如:
sqlplus -s "username/password@dbip:dbport/SID" @sql_script.sql
在脚本末尾添加done
我正在尝试设置一个 bash 脚本,在该脚本中连接到 Oracle 实例以检查计划的各种 dba 作业,如果特定作业不是 运行ning 我需要显示一个错误信息。
这是我编写的脚本,它部分有效,该脚本仅在到达 IF 语句之前有效
#!/usr/bin/env bash
#write output of the sql query to an output file
output_file="/tmp/datatool_output.csv"
> $output_file
echo "
SET FEED OFF
SET PAGESIZE 0
SET COLSEP ,
SET linesize 100
SET TRIMSPOOL ON
SET TRIMOUT ON
SELECT JOB_NAME, STATE FROM DBA_SCHEDULER_JOBS where job_name ='run_LoadDatatoolStore';
exit" | sqlplus -s sqlplus -s "username/password@dbip:dbport/SID" >> $output_file
a_var=($(awk -F',' '{print }' $output_file | sed 's/\s//g' | xargs))
for item in ${a_var[@]}
do
val=$(echo $item | awk -F',' '{print }')
if [[ $val -eq "SCHEDULED" ]] || [[ $val -eq "RUNNING" ]] ; then
echo "OK: The job LoadDatatool is either Scheduled or in the Running state"
exit 0 # this is used for interpretation by nagios to display no alert alert
else [[ $val -eq "BLOCKED" ]]
echo "CRITICAL: The Db scheduler job LoadDatatool is in a Blocked state"
exit 2
fi
我明白了
test.sh: line 24: syntax error: unexpected end of file
当我 运行 脚本时,我们将不胜感激。
谢谢, 卡尔提克
你应该这样重写你的if
:
if [[ $val -eq "SCHEDULED" ]] || [[ $val -eq "RUNNING" ]] ; then
成为
if [[ $val = "SCHEDULED" ]] || [[ $val = "RUNNING" ]] ; then
或
if [[ $val = "SCHEDULED" || $val = "RUNNING" ]] ; then
-eq
用于比较数字,=
用于比较字符串
P.S。此外,您可以使用 sqlplus
的 SPOOL
功能来代替 sqlplus
的重定向输出
而不是这个丑陋的 echo
你可以在文件中写入 sql
并从命令行执行它,如:
sqlplus -s "username/password@dbip:dbport/SID" @sql_script.sql
在脚本末尾添加done