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

猜你喜欢

转载自www.cnblogs.com/nulige/p/9034394.html
今日推荐