事情是这样的:公司有几个PHP脚本需要在后台一直运行着,主要功能是把文件发送到另外一个地方,本来用的是Linux的crontab,但是呢,觉得不高级,就让用shell脚本运行,大致思路是shell脚本里面写PHPcli模式的代码,然后运行,为了防止一些特殊情况导致的脚本不运行,所以设置的开机启动。
shell脚本的写法是真的很简单,只需要在开始的地方加上一下代码就可以了
#!/bin/bash
但是运行的时候就需要注意脚本可能没有运行权限,所以需要执行以下代码,给脚本赋予可执行的权限
chmod +x XXX.sh
就可以执行脚本了,执行脚本有很多种方法,比如我用的就是
cd XX
到脚本的目录下,然后
./XXX.sh
即可.
接着就是加入开机启动项,这项是比较麻烦的,我尝试了网上很多方法才成功,这里介绍两种方法。
两种方法都需要先在脚本里加上以下代码
# chkconfig: 2345 10 90
# description: XXX.sh
其中2345是默认启动级别,级别有0-6共7个级别。
等级0表示:表示关机
等级1表示:单用户模式
等级2表示:无网络连接的多用户命令行模式
等级3表示:有网络连接的多用户命令行模式
等级4表示:不可用
等级5表示:带图形界面的多用户模式
等级6表示:重新启动
10是启动优先级,90是停止优先级,优先级范围是0-100,数字越大,优先级越低。
上面的注释的意思是,XXX.sh服务必须在运行级2,3,4,5下被启动或关闭,启动的优先级是10,关闭的优先级是90
方法一:
打开/etc/rc.d/rc/local文件,在末尾增加如下内容
/opt/script/XXX.sh
在centos7中,/etc/rc.d/rc.local的权限被降低了,所以需要执行如下命令赋予其可执行权限
chmod +x /etc/rc.d/rc.local
方法二:
1、将脚本移动到/etc/rc.d/init.d目录下
mv /opt/script/XXX.sh /etc/rc.d/init.d
2、增加脚本的可执行权限
chmod +x /etc/rc.d/init.d/XXX.sh
3、添加脚本到开机自动启动项目中
cd /etc/rc.d/init.d
chkconfig –add XXX.sh
chkconfig XX.sh on
走到这一步只要没报错就是加入成功了,然后我们用查看开机启动项的命令
chkconfig
就可以看到脚本已经加入到开机启动了
然后就是最关键的一步了,运行我们刚刚加入开机启动的脚本(服务)
service cli.sh restart
需要注意下这里Linux7.2以后最好写成绝对路径,而且不推荐使用service启动了
就会发现……报错啦,报错信息是
php: command not found
这个跟脚本写的不对有关系,之前的脚本一直是这么写的
php /data/wwwroot/XXX.com/public/index.php /process/send
这个在cli模式下跑就没问题,但是放在这里就会报错,所以需要把php写成全路径
/usr/local/php/bin/php /data/wwwroot/XXX.com/public/index.php /process/send
这样就没问题了,可以完美运行,不过要注意的是代码里面如果用到了文件夹路径之类的,需要写成全路径,../XXX之类的无法识别,目前无法知道原因,有知道的大佬可以私信我。
运行之后会发现如果ctrl+C或者关闭连接,脚本就会不执行,可以用nohup命令让她后台运行
nohup service XXX.sh restart &
这样字就算关闭连接之后,下次连接的时候用命令
ps -e
也可以看到进程依然在运行
0 条评论