隔着屏幕轻易产生感情的你,肯定很孤独吧。

事情是这样的:公司有几个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

也可以看到进程依然在运行

分类: Linux

0 条评论

发表评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据