一、脚本服务化目的
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 `$'{ ''
这是因为window 下换行是 ,linux 下换行是 。我在window下编写的shell 脚本拷贝到linux上。shell命令解读时会先解读/r,在解读后面的脚本导致报错。而且这个 在Linux上是看不到的。
解决方法:
sed 's/ //' 原文件 >转换后文件
二、参考: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