请大神:shutdown触发shell脚本关闭sybaes数据库的诡异之处

程序开发,脚本,各类开发工具,程序语言讨论

版主: *sake

请大神:shutdown触发shell脚本关闭sybaes数据库的诡异之处

#1  牵牛花大神 » 周三 1月 11日, 2017年 7:10 pm

希望厉害的你能帮助我。
我的脚本 myscript.sh 调用脚本 closeSybase.sh,
脚本 myscript.sh 里面的除了调用 closeSybase.sh 外,还用来检测 sybase 运行状态,
脚本 closeSybase.sh 的功能是关闭 sybase 数据库,
那么问题是:
我手工执行脚本 myscript.sh 时,它调用脚本 closeSybase.sh 关闭数据库执行后,在 myscript.sh 里面的语句检测 sybase 已经关闭。

而 shutdown 关机触发执行 myscript.sh 的场景下就不好使了,因为 myscript.sh 脚本里面的判断语句检测到数据库始终是运行的(我让脚本打了日志,在日志里面看到的始终是运行的)。

诡异的地方还有:如果把以上两个脚本功能合写在一个脚本里,那么关闭 sybase 的语句执行后,后面检测 sybase 运行与否的语句的检测结果却始终是运行的,无法得到更新的 sybase 运行状态

难道这是脚本的坑吗
头像
牵牛花大神
 
帖子: 8
注册: 周六 12月 10日, 2016年 1:44 pm
Cash on hand: 59.00
送出感谢: 0 次
收到感谢: 0 次

Re: 请大神:shutdown触发shell脚本关闭sybaes数据库的诡异之处

#2  AstroProfundis » 周四 1月 12日, 2017年 4:48 pm

贴脚本内容,以及“shutdown 关机触发执行 myscript.sh”具体是怎么实现的
How many stars in your bowl, How many sorrows in your soul?
--
发帖前请注意各版块要求与限制,问题求助请尽量给出详细日志信息或重现问题的步骤
问题解决后请在标题前加[已解决]标签,若放弃或采用替代方案也请尽量注明,方便其他用户查阅参考
论坛兼职SA, 发现访问出错等问题可私信告知 | 邮箱:allen (at) atr (dot) me | GPG Key: 0xF7964FB5
头像
AstroProfundis
使徒
 
帖子: 373
注册: 周六 3月 30日, 2013年 8:59 pm
Cash on hand: 188.40
Bank: 141.00
地址: 杭州
送出感谢: 9
收到感谢: 10
勋章: 5
I knew SuSE from Day One! (1) Site Admin (1) Moderator (1)
Donator (1) 1310Pro (1)

Re: 请大神:shutdown触发shell脚本关闭sybaes数据库的诡异之处

#3  牵牛花大神 » 周一 1月 16日, 2017年 12:28 am

由于代码和日志全在公司内网里,外网无法获取,不可以拷贝,否则违规,后果严重,所以我在这里只能详述一下:

shutdown 关机触发执行 myscript.sh”具体实现: 参照资料:https://zh.opensuse.org/index.php?title=openSUSE:Packaging_init_scripts&variant=zh-cn
一:将 myscript.sh 脚本按照 LSB 规范书写:
脚本头部添加注释信息:
### BEGIN INIT INFO
# Provides: qnhds // 指定服务名,可以通过 chkconfig --list 查看服务,如果成功注册为服务,可以看到服务名:qnhds
# Required-Start: // 指定运行此脚本必须运行 (是必须运行) 着的服务,这里没有指定
# Should-Start: nms sybase // 指定运行此脚本需要运行 (不是必须运行) 着的服务是 nms 和 sybase 服务
# Required-Stop: // 指定运行此脚本必须停止 (是必须停止) 的服务,这里没有指定
# Should-Stop: // 指定运行此脚本需要停止 (不是必须运行) 的服务,这里没有指定
# Default-Start: 0 6 // 这一行注释信息指定了默认启动脚本的运行级别是 0 和 6,即是重启或关机时触发 myscript.sh 的执行
# Default-Stop:
# Short-Description: Sound daemon with network support
# Description: stop the nms and sybase service
### END INIT INFO


二:将 myscript.sh 脚本放到 /etc/init.d/ 目录下
三:cd /etc/init.d/ , 执行命令:chkconfig --add myscript.sh
四:cd /etc/init.d/ , 执行命令:insserv myscript.sh
做完以上步骤,就成功地把 myscript.sh 脚本注册为系统服务,并且是开机时 / 关机时启动。
该脚本打印了详细的操作日志,并且打印了 isql 连接数据库、执行停止 sybase 的详细日志。
手动执行 myscript 脚本时,可以正常运行,并且成功执行关闭 sybase 数据库的语句,随后的语句判断 sybase 数据库的状态是停止。从日志里看到的,一切正常,实现了编程目的。
但是在命令行里执行:shutdown -r now 命令时,suse 系统成功重启后,通过查看 myscript 的操作日志,发现 脚本中判断 sybase 运行状态的语句打印的日志显示:sybase 数据库是运行的,日志其他部分与手动执行产生的日志一样,没有区别。这就奇怪了,为什么在手动执行 myscript 脚本的时候可以实现停止 sybase,而 shutdown 触发执行它的时候就得不到数据库停止的结果?
头像
牵牛花大神
 
帖子: 8
注册: 周六 12月 10日, 2016年 1:44 pm
Cash on hand: 59.00
送出感谢: 0 次
收到感谢: 0 次

请大神:shutdown触发shell脚本关闭sybaes数据库的诡异之处

#4  marguerite » 周一 1月 16日, 2017年 10:03 am

@牵牛花大神

Hi,具体脚本看不到我理解,我现在想知道几件事:

1. myscript 是怎么检测 Sybase 是否在运行的,通过进程?通过 PID 文件?通过 socket?

2. 执行 closeSybase 后,你有没有加 wait?Systemd 是并发的...看你的描述我感觉是 closeSybase 执行后就不管它,直接去取状态了。

3. Systemd 关机时服务的执行顺序跟开机是反的,你的 myscript 是在 ExecStart 里调用的还是在 ExecStop 里调用的?正常是 ExecStop 里。所以你的 myscript 脚本的 stop block 是怎么写的?不会写到 start block 里去了吧?因为 systemd 对 sysvinit 脚本的兼容是 start 对应 ExecStart,stop 对应 ExecStop,然后你的脚本只管关机,你觉得在 start 里执行就好。

Sybase 是闭源的,不过我们可以用 mysql 之类的来模拟的。问题是能够得到解决的,但你的让我们能够模拟出来...




从我的 iPhone 发送,使用 Tapatalk
头像
marguerite
寨主
 
帖子: 3267
注册: 周六 3月 30日, 2013年 12:50 am
Cash on hand: 766.10
Bank: 6,044.70
送出感谢: 24
收到感谢: 340
勋章: 4
I knew SuSE from Day One! (1) Site Admin (1) developer (1)
1310Pro (1)

Re: 请大神:shutdown触发shell脚本关闭sybaes数据库的诡异之处

#5  marguerite » 周一 1月 16日, 2017年 10:15 am

另外,我觉得两个脚本是可以改成一个 systemd service 的...


从我的 iPhone 发送,使用 Tapatalk
头像
marguerite
寨主
 
帖子: 3267
注册: 周六 3月 30日, 2013年 12:50 am
Cash on hand: 766.10
Bank: 6,044.70
送出感谢: 24
收到感谢: 340
勋章: 4
I knew SuSE from Day One! (1) Site Admin (1) developer (1)
1310Pro (1)

请大神:shutdown触发shell脚本关闭sybaes数据库的诡异之处

#6  牵牛花大神 » 周二 1月 17日, 2017年 12:28 am

首先答复 4 楼的问题:
Hi,具体脚本看不到我理解,我现在想知道几件事:

1. myscript 是怎么检测 Sybase 是否在运行的,通过进程?通过 PID 文件?通过 socket?
回答: 实现方式是 pronum=`ps -ef | grep sybase | grep DBSVR | grep -v grep|wc -l`
# 得出进程中包含数据库相关进程的数目

2. 执行 closeSybase 后,你有没有加 wait?Systemd 是并发的... 看你的描述我感觉是 closeSybase 执行后就不管它,直接去取状态了。
回答:你说加 wait 的意思是指等待一段时间吗,我在代码中有 sleep 50 ,但实际发现无论 sleep 多久,哪怕是 sleep 600,sybase 运行状态始终是 true。
后来又添加了问题 1 中的判断 sybase 相关的进程是否存在的语句, 可打印的日志显示 sybase 仍然是运行的。

3. Systemd 关机时服务的执行顺序跟开机是反的,你的 myscript 是在 ExecStart 里调用的还是在 ExecStop 里调用的?正常是 ExecStop 里。所以你的 myscript 脚本的 stop block 是怎么写的?不会写到 start block 里去了吧?因为 systemd 对 sysvinit 脚本的兼容是 start 对应 ExecStart,stop 对应 ExecStop,然后你的脚本只管关机,你觉得在 start 里执行就好。
回答:myscript 是在 start 代码块执行的,经过对比确认关机的时间和脚本打印日志的时间,myscript 脚本确实是在关机时启动的。
Sybase 是闭源的,不过我们可以用 mysql 之类的来模拟的。问题是能够得到解决的,但你的让我们能够模拟出来...

下面是牵牛花大神的回复:
资料参考:
https://zh.opensuse.org/index.php?title ... iant=zh-cn
第一步:
下面是启动的脚本 startMscript 内容,放在 /etc/init.d/ 目录下,
### BEGIN INIT INFO
# Provides: Pharbitis
# Required-Start:
# Should-Start: sybase
# Required-Stop:
# Should-Stop:
# Default-Start: 0 6
# Default-Stop: 1 2 3 5
# Short-Description: Sound daemon with network support
# Description: Starts esound server to allow remote access to sound
### END INIT INFO
case "$1" in
start)
timeout 300 bash /opt/tools/myscript.sh
;;
stop)
;;
esac


下面是 myscript 脚本内容,放在 /opt/tools/ 目录下
#!/bin/bash
# 此处省略一些打印日志的代码 和其他辅助代码 , 仅列出调用 jar
# 这里使用 java 调用 closeSybase.sh 关闭 sybase 数据库。在 java 内部调用实现调用 closeSybase.sh,向该脚本传入密码参数
/opt/OSSJRE/linux/java -classpath XXX.jar com.oss.mainFrame "/opt/tools/closeSybase.sh"
sleep 50
pronum=`ps -ef | grep sybase | grep DBSVR | grep -v grep|wc -l`
# 得出进程中包含数据库相关进程的数目
# 判断 pronum 数目是否为 0,下面省略判断及打印日志部分代码

下面是 closeSybase.sh 脚本内容,放在 /opt/tools/ 目录下
. /opt/sybase/SYBASE.sh
cd /opt/sybase/OCS*/bin
bb=$(cat)
# 由于当前脚本是用 -classpath 的形式调用的,变量 bb 用来接收 java 传进来的密码
isql -SDBSVR -Usa -P${bb} -zus_english -o/opt/isql_result.log<<EOF
shutdown SYB_BACKUP
go
shutdown
go
exit
EOF

cd /opt/oss/engr/tools/stopNMS_DB.sh_log/
echo " line[${LINENO}] stopsinglesybase end of excute..">>${logfile}
#sleep 50
echo "`ps -ef | grep sybase | grep DBSVR | grep -v grep|wc -l`">>${logfile}
echo " now is checking the sybase status......">>${logfile}
isdbrun="false" # 此变量用于标记数据库运行状态
Line_Number=`ps -ef | grep sybase | grep DBSVR | grep -v grep|wc -l` # 得出进程中包含数据库相关进程的数目

if [ $Line_Number -eq 0 ]; then

# 数据库进程记录为 0,说明已经停止
echo " line[${LINENO}] sybase has been shutdown ! ">>${logfile}
echo -e "\033[31m sybase has been shutdown ! \033[0m">>${logfile}
else

# 如果数据库没有完全停止,杀进程(sybase 数据库相关的进程)
pro1=`ps -ef|grep RUN_DBSVR|grep -v grep | grep -v killall | awk '{print $3}'`
kill -9 $pro1
pro2=`ps -ef|grep -sDBSVR|grep -v grep | grep -v killall | awk '{print $3}'`
kill -9 $pro2
pro3=`ps -ef|grep RUN_DBSVR_back|grep -v grep | grep -v killall | awk '{print $3}'`
kill -s 9 $pro3
pro4=`ps -ef|grep -SDBSVR_back|grep -v grep | grep -v killall | awk '{print $3}'`
kill -s 9 $pro4
#sleep 20
fi

第二步::执行命令,添加 startMscript 脚本为关机启动项
chkconfig --add startMscript

第三步:shutdown -r now

第四步::SUSE 开机成功后,查看打印的日志文件,日志显示关机过程中 myscript 脚本调用 closeSybase.sh 脚本,并 sleep 50 秒后 ,判断 sybase 运行状态的结果 仍然是运行的。
为什么在 SUSE 系统里 手动直接 bash /opt/oss/myscript.sh 却可以成功停止 sybase,好迷乱啊
头像
牵牛花大神
 
帖子: 8
注册: 周六 12月 10日, 2016年 1:44 pm
Cash on hand: 59.00
送出感谢: 0 次
收到感谢: 0 次

请大神:shutdown触发shell脚本关闭sybaes数据库的诡异之处

#7  marguerite » 周二 1月 17日, 2017年 8:39 am

那我猜就是写到了 start block 里的原因了…正常应该写到 stop block 里...因为你的脚本只干了 stop...start/stop 的意思不是启动停止脚本本身,而是启动停止脚本对应的服务...所以 start 里面都是启动服务的东西,stop 里面都是停止服务的东西,具体的还要验证一下。有时候程序是运行了,但能跑不代表如预期的跑,摊手…


从我的 iPhone 发送,使用 Tapatalk
头像
marguerite
寨主
 
帖子: 3267
注册: 周六 3月 30日, 2013年 12:50 am
Cash on hand: 766.10
Bank: 6,044.70
送出感谢: 24
收到感谢: 340
勋章: 4
I knew SuSE from Day One! (1) Site Admin (1) developer (1)
1310Pro (1)

Re: 请大神:shutdown触发shell脚本关闭sybaes数据库的诡异之处

#8  marguerite » 周二 1月 17日, 2017年 11:09 pm

这是我的版本 /etc/init.d/sybase:

代码: 全选
#!/bin/sh
### BEGIN INIT INFO
# Provides:   sybase (注意这里的名字一定要写成 /etc/init.d 下面的那个名字,这里是 sybase,不能大写首字母,或者写成其它什么鬼)
# Required-Start:
# Should-Start:
# Required-Stop:
# Should-Stop:
# Default-Start:   0 6
# Default-Stop:      1 2 3 4 5
# Short-Description:   Sybase daemon
# Description:   Start Sybase daemon
### END INIT INFO

case "$1" in
   start)
      /home/marguerite/start.sh
   ;;
   stop)
               /home/marguerite/stop.sh
   ;;
esac


跟你的没什么不同,chkconfig -a sybase 之后(chkconfig -a 就会调用 insserv,所以你后面那步 insserv 是多余的),通过 sudo systemctl status sybase.service 能看到

代码: 全选
● sybase.service - LSB: Sybase daemon
   Loaded: loaded (/etc/init.d/sybase; bad; vendor preset: disabled)
   Active: inactive (dead)
     Docs: man:systemd-sysv-generator(8)


是被 systemd 管理。这是我的 /home/marguerite/start.sh

代码: 全选
#!/bin/sh
echo "sybase start block runs" | systemd-cat -t sybase -p emerg


我的 /home/marguerite/stop.sh

代码: 全选
#!/bin/sh
echo "sybase stop block runs" | systemd-cat -t sybase -p emerg


命令的意思是把某句话写到 systemd 的 journal 里,方便我确定运行了哪个脚本。
如果关机是运行的 start block 的话,journal 里就会有那句话,运行的 stop block 的话,里面就应该是另外一句。

代码: 全选
sudo journalctl --since 22:57 | grep "sybase"


(困了,详情如何,且待下回分晓)
头像
marguerite
寨主
 
帖子: 3267
注册: 周六 3月 30日, 2013年 12:50 am
Cash on hand: 766.10
Bank: 6,044.70
送出感谢: 24
收到感谢: 340
勋章: 4
I knew SuSE from Day One! (1) Site Admin (1) developer (1)
1310Pro (1)

Re: 请大神:shutdown触发shell脚本关闭sybaes数据库的诡异之处

#9  牵牛花大神 » 周三 1月 18日, 2017年 12:20 am

非常感谢 marguerite,今天在公司折腾了一天,同时搞两个需求,都是在空档时间切换着搞,环境来回搭建地折腾,好累。
看到你的回复真的很感动,我在其他论坛发布的帖子根本没有人回复,为 marguerite 的精神占赞。
明天到公司按照你的方法再搞一遍。多谢多谢
头像
牵牛花大神
 
帖子: 8
注册: 周六 12月 10日, 2016年 1:44 pm
Cash on hand: 59.00
送出感谢: 0 次
收到感谢: 0 次

Re: 请大神:shutdown触发shell脚本关闭sybaes数据库的诡异之处

#10  牵牛花大神 » 周三 1月 18日, 2017年 1:41 am

为何无法将 level 6 设置成 on 呢,经过实际运行,确认重启时会启动脚本的运行
图片
图片
虽说 level 6 没有设置成 on ,但关机,重启 SUSE 确实执行了脚本
图片
头像
牵牛花大神
 
帖子: 8
注册: 周六 12月 10日, 2016年 1:44 pm
Cash on hand: 59.00
送出感谢: 0 次
收到感谢: 0 次

下一页

回到 开发与开发工具

在线用户

正在浏览此版面的用户:没有注册用户 和 1 位游客