alibaba / canal

阿里巴巴 MySQL binlog 增量订阅&消费组件
Apache License 2.0
28.5k stars 7.62k forks source link

canal 是否支持systemctl方式启动和停止 #1781

Closed paulqi closed 5 years ago

paulqi commented 5 years ago

Question

我尝试了

[Unit] Description=canal server Application After=network.target [Service] Type=simple ExecStart=/root/canaldeploy/bin/startup.sh ExecStop=/root/canaldeploy/bin/stop.sh

User=root Group=root [Install] WantedBy=multi-user.target

问题: 启动后马上stop掉

日志输出如下:

● canal.service - canal server Application Container Loaded: loaded (/etc/systemd/system/canal.service; disabled; vendor preset: disabled) Active: inactive (dead)

May 05 22:00:09 sh1uatfntwebl02 systemd[1]: Starting canal server Application Container... May 05 22:00:09 sh1uatfntwebl02 startup.sh[23457]: cd to /root/canaldeploy/bin for workaround relative path May 05 22:00:09 sh1uatfntwebl02 startup.sh[23457]: LOG CONFIGURATION : /root/canaldeploy/bin/../conf/logback.xml May 05 22:00:09 sh1uatfntwebl02 startup.sh[23457]: canal conf : /root/canaldeploy/bin/../conf/canal.properties May 05 22:00:09 sh1uatfntwebl02 startup.sh[23457]: CLASSPATH :/root/canaldeploy/bin/../conf:/root/canaldeploy/bin/../lib/zookeeper-3.4.5.jar:/root/canaldepl...pring-jdb May 05 22:00:09 sh1uatfntwebl02 startup.sh[23457]: fka_2.11-1.1.1.jar:/root/canaldeploy/bin/../lib/jsr305-3.0.2.jar:/root/canaldeploy/bin/../lib/jopt-simple.../canaldep May 05 22:00:09 sh1uatfntwebl02 stop.sh[23468]: sh1uatfntwebl02: stopping canal 23467 ... May 05 22:00:09 sh1uatfntwebl02 startup.sh[23457]: b/aviator-2.2.1.jar:/root/canaldeploy/bin/../lib/aopalliance-1.0.jar:/root/canaldeploy/bin/../lib/aliware...-1.0.jar: May 05 22:00:09 sh1uatfntwebl02 startup.sh[23457]: cd to / for continue May 05 22:00:09 sh1uatfntwebl02 stop.sh[23468]: Oook! cost:0 Hint: Some lines were ellipsized, use -l to show in full.

paulqi commented 5 years ago

在centos 7 里直接使用startup.sh和stop.sh启动没问题,可是使用systemd 不行,启动起来就挂掉了

agapple commented 5 years ago

对这块不是很熟,可以考虑提交一个PR给我

WuYongCong commented 4 years ago

修改 startup.sh 文件,在底部添加 tail -f /dev/null 命令。

kongfei605 commented 2 years ago

type=simple 改成type=forking 就可以

lucher commented 2 years ago

修改 startup.sh 文件,在底部添加 tail -f /dev/null 命令。

这个方案有效,请教下,为什么不加的时候无法启动?加完后可以启动?

lucher commented 2 years ago

type=simple 改成type=forking 就可以

这个方案也可以,请教下,使用simple的时候为什么会退出?

kongfei605 commented 2 years ago

startup.sh 是把canal放到后台启动,然后脚本退出。 systemd是保证追踪的进程是存在的(进程是运行的),type=simple追踪的是启动进程(脚本的pid),脚本退出后,systemd判断为启动失败;forking就是追踪脚本fork出来的进程(canal 的pid),不管启动脚本是否退出。

如果 你尝试用supervisord, 会了解startup.sh 需要用exec +启动命令 。 exec就是用新进程代替当前进程,但是pid不变。

tail -f /dev/null 起的作用就是,后台fork子进程canal,tail -f 是保证当前脚本不退出。systemd的killmode默认是control-group,所以stop时 会停tail -f ,也会停子进程 canal。

可以搜索下 nohup vs. exec systemd 的 type参数 、killmode

lucher commented 2 years ago

startup.sh 是把canal放到后台启动,然后脚本退出。 systemd是保证追踪的进程是存在的(进程是运行的),type=simple追踪的是启动进程(脚本的pid),脚本退出后,systemd判断为启动失败;forking就是追踪脚本fork出来的进程(canal 的pid),不管启动脚本是否退出。

如果 你尝试用supervisord, 会了解startup.sh 需要用exec +启动命令 。 exec就是用新进程代替当前进程,但是pid不变。

tail -f /dev/null 起的作用就是,后台fork子进程canal,tail -f 是保证当前脚本不退出。systemd的killmode默认是control-group,所以stop时 会停tail -f ,也会停子进程 canal。

可以搜索下 nohup vs. exec systemd 的 type参数 、killmode

startup.sh 是把canal放到后台启动,然后脚本退出。 systemd是保证追踪的进程是存在的(进程是运行的),type=simple追踪的是启动进程(脚本的pid),脚本退出后,systemd判断为启动失败;forking就是追踪脚本fork出来的进程(canal 的pid),不管启动脚本是否退出。

如果 你尝试用supervisord, 会了解startup.sh 需要用exec +启动命令 。 exec就是用新进程代替当前进程,但是pid不变。

tail -f /dev/null 起的作用就是,后台fork子进程canal,tail -f 是保证当前脚本不退出。systemd的killmode默认是control-group,所以stop时 会停tail -f ,也会停子进程 canal。

可以搜索下 nohup vs. exec systemd 的 type参数 、killmode

明白了,非常感谢写了这么详细的解释。