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

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

版主: *sake

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

#11  marguerite » 周三 1月 18日, 2017年 2:27 pm

我觉得你觉得脚本执行了一定是错觉。我昨晚关机再开好多次,journal 里既没有 start block 也没有 stop block,也就是说服务根本没在 halt 的时候跑。实际上证明脚本执行了的方法很简单,随便 echo 点什么,然后用 systemd-cat 输出到 journal,journal 里有你 echo 的东西就是脚本执行了。

我猜测你觉得脚本执行了是因为它被自动转换成 systemd service 后是在开机运行了你的 start block。

于是我又仔细看了一下,发现一开始就被你绕进去了。你对运行级别 runlevel 的理解不对…运行级别是“处在那个状态”的时候,不是“那个状态发生前”的时候,所以比如 0 halt 状态,这个时候系统是关机断电了,什么也执行不了,6 reboot 同理。

真正想要关机或重启前执行什么东西,应该跟普通脚本一样,运行级别的 Default-Start 是 3 5,Default-Stop 是 0 1 2 4 6。因为 0 1 2 4 6 几乎都是特殊状态,处在那种状态里基本什么都干不了。然后通过 Required-Start 和 Required-Stop 这些脚本 dependency 来实现关机或重启执行脚本的 stop block。

这个逻辑是设计好的,你只能跟着逻辑走,不能去创造自己的逻辑。这个逻辑就是,在运行级别 3 5 下,通过 Required-Start 在比如有网了之后启动 sshd,通过 Required-Stop 在没网之前就停止 sshd,所以我一直强调关机跟开机是反的。你这里最多只是需要一些特殊的服务来确定关机,类似于 systemd 里的 multiuser.target,这个查资料能找到 sysvinit 对应的。所以你想要在关机执行你写的那个 sysvinit 脚本的 start 部分,简单说就是不可能的,start 部分只能在开机执行。

所以你的问题不是那两个脚本,是你对 runlevel,sysvinit 和 systemd 的理解有点想当然。回头我写个例子出来吧。

你的脚本就算能执行我觉得也是相当随机的,因为它没有把自己的依赖关系理顺,最终关机了它肯定会被停止,但如果那个时候连根分区都卸载了,你肯定取不到进程因为没有 ps 命令之类的。没法解释更多,只能说非预期行为,因为我也不知道它究竟什么时候停止的。


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

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

#12  marguerite » 周四 1月 19日, 2017年 12:01 am

最终能用的 /etc/init.d/sybase 在这里,主要就是改了 runlevel,加了 Default-Start 和 Default-Stop。

代码: 全选
#!/bin/sh
### BEGIN INIT INFO
# Provides:   sybase
# Required-Start: $remote_fs $syslog
# Should-Start:
# Required-Stop: $remote_fs $syslog
# Should-Stop:
# Default-Start:   3 4 5
# Default-Stop:      0 1 2 6
# Short-Description:   Sybase daemon
# Description:   Stop Sybase daemon and check database status
### END INIT INFO

case "$1" in
   start)
   ;;
   stop)
       /opt/sybase/myscript.sh
   ;;
esac


开机,关机,重启都会运行,其中只要关机或重启都会调用 myscript.sh。开机调用的是 start block 所以什么都不做。

再具体的,你先这么改了再看。

另外建议用 systemd-cat -t sybase-daemon -p info/warning/emerg 写入 systemd journal,这样比较好调试。写自己的 $log 里对于业务是方便,但对于过程不方便,因为你不知道与此同时 systemd 在干嘛。写到一起就方便多了。
头像
marguerite
寨主
 
帖子: 3308
注册: 周六 3月 30日, 2013年 12:50 am
Cash on hand: 738.10
Bank: 6,036.70
送出感谢: 24
收到感谢: 349
勋章: 4
I knew SuSE from Day One! (1) Site Admin (1) developer (1)
1310Pro (1)

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

#13  牵牛花大神 » 周四 1月 19日, 2017年 7:51 pm

厉害,你说的对,我处从做这个需求时就搞不清楚运行级别的事情,寨主好厉害。
似乎明白了一些你强调的 start 和 stop 的意义。
头像
牵牛花大神
 
帖子: 8
注册: 周六 12月 10日, 2016年 1:44 pm
Cash on hand: 59.00
送出感谢: 0 次
收到感谢: 0 次

上一页

回到 开发与开发工具

在线用户

正在浏览此版面的用户:Bing [Bot] 和 1 位游客