linux systemctl service examples
一、脚本服务化目的
1、python 在 文本处理中有着广泛的应用,为了满足文本数据的获取,会每天运行一些爬虫抓取数据。但是网上买的服务器会不定时进行维护,服务器会被重启。这样我们的爬虫服务就无法运行。这个时候我们可以把python脚本服务化,服务器重启后,脚本就会自动运行。解决服务器维护后需要手动运行python脚本。
2、实现方法:
给编写好的python脚本开头加上
#!/usr/bin/python
3、启动shell 脚本 编写
vi pystock.sh
#vim /etc/init.d/httpd
#!bin/bash
lock="py_stock.py"
#启动服务方法
start(){
echo "service start...."
su root -c "python /root/python/py_stock/src/crawler/py_stock.py &"
}
#停止服务方法
stop(){ echo "service stop...." pkill -f $lock}
#查看服务状态
status(){
if [ -e $lock ];then
echo "$0 service start"
else
echo "$0 service stop"
fi
}
#重新启动
restart(){
stop
start
}
case "$1" in
"start")
start
;;
"stop")
stop
;;
"status")
status
;;
"restart")
restart
;;
*)
echo "$0 start|stop|status|restart"
;;
esac
3、复制脚本到/etc/init.d/目录下:cp pystock.sh /etc/init.d/
4、给shell脚本赋予执行权限 :chmod +x /etc/init.d/pystock.sh
5、添加服务:chkconfig --add pystock.sh
6、设置服务为开机启动:chkconfig --level 35 pystock.sh on
出现的问题:
当我运行shell 脚本启动python脚本时,提示我一下错误
syntax error near unexpected token `$'{\r''
这是因为window 下换行是\r\n,linux 下换行是\n。我在window下编写的shell 脚本拷贝到linux上。shell命令解读时会先解读/r,在解读后面的脚本导致报错。而且这个\r 在Linux上是看不到的。
解决方法:
sed 's/\r//' 原文件 >转换后文件
二、参考:http://0pointer.de/public/abrtd
#!/bin/bash
# Starts the abrt daemon
#
# chkconfig: 35 82 16
# description: Daemon to detect crashing apps
# processname: abrtd
### BEGIN INIT INFO
# Provides: abrt
# Required-Start: $syslog $local_fs
# Required-Stop: $syslog $local_fs
# Default-Stop: 0 1 2 6
# Default-Start: 3 5
# Short-Description: start and stop abrt daemon
# Description: Listen to and dispatch crash events
### END INIT INFO
# Source function library.
. /etc/rc.d/init.d/functions
ABRT_BIN="/usr/sbin/abrtd"
LOCK="/var/lock/subsys/abrtd"
OLD_LOCK="/var/lock/subsys/abrt"
RETVAL=0
#
# Set these variables if you are behind proxy
#
#export http_proxy=
#export https_proxy=
#
# See how we were called.
#
check() {
# Check that we're a privileged user
[ "`id -u`" = 0 ] || exit 4
# Check if abrt is executable
test -x $ABRT_BIN || exit 5
}
start() {
check
# Check if it is already running
if [ ! -f $LOCK ] && [ ! -f $OLD_LOCK ]; then
echo -n $"Starting abrt daemon: "
daemon $ABRT_BIN
RETVAL=$?
[ $RETVAL -eq 0 ] && touch $LOCK
echo
fi
return $RETVAL
}
stop() {
check
echo -n $"Stopping abrt daemon: "
killproc $ABRT_BIN
RETVAL=$?
[ $RETVAL -eq 0 ] && rm -f $LOCK
[ $RETVAL -eq 0 ] && rm -f $OLD_LOCK
echo
return $RETVAL
}
restart() {
stop
start
}
reload() {
restart
}
case "$1" in
start)
start
;;
stop)
stop
;;
reload)
reload
;;
force-reload)
echo "$0: Unimplemented feature."
RETVAL=3
;;
restart)
restart
;;
condrestart)
if [ -f $LOCK ]; then
restart
fi
# update from older version
if [ -f $OLD_LOCK ]; then
restart
fi
;;
status)
status abrtd
RETVAL=$?
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|reload|force-reload}"
RETVAL=2
esac
exit $RETVAL
三、参考系统示例
[root@docker-server ~]# cd /etc/init.d/
[root@docker-server init.d]# ll
total 32
-rw-r--r--. 1 root root 15301 Aug 30 2016 functions
-rwxr-xr-x. 1 root root 2989 Aug 30 2016 netconsole
-rwxr-xr-x. 1 root root 6834 Aug 30 2016 network
-rw-r--r--. 1 root root 1160 Oct 12 2016 README
[root@docker-server init.d]# cvat README
-bash: cvat: command not found
[root@docker-server init.d]# cat README
You are looking for the traditional init scripts in /etc/rc.d/init.d,
and they are gone?
Here's an explanation on what's going on:
You are running a systemd-based OS where traditional init scripts have
been replaced by native systemd services files. Service files provide
very similar functionality to init scripts. To make use of service
files simply invoke "systemctl", which will output a list of all
currently running services (and other units). Use "systemctl
list-unit-files" to get a listing of all known unit files, including
stopped, disabled and masked ones. Use "systemctl start
foobar.service" and "systemctl stop foobar.service" to start or stop a
service, respectively. For further details, please refer to
systemctl(1).
Note that traditional init scripts continue to function on a systemd
system. An init script /etc/rc.d/init.d/foobar is implicitly mapped
into a service unit foobar.service during system initialization.
Thank you!
Further reading:
man:systemctl(1)
man:systemd(1)
http://0pointer.de/blog/projects/systemd-for-admins-3.html
http://www.freedesktop.org/wiki/Software/systemd/Incompatibilities
四、利用systemctl添加自定义系统服务
参考:https://www.cnblogs.com/saneri/p/7778756.html

浙公网安备 33010602011771号