Linux centos7.*版本运行shell脚本和设置开机启动项

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

就会发现……报错啦,报错信息是

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挂载U盘

之前因工作需要,去公安局内网安装系统,需要将U盘挂载到linux系统上,方法很简单,记录下来以便自己日后之需。
挂载U盘一般放在根目录目录下面的mnt文件下,在这个文件里创建一个文件,名字随便起,当然了,按照规矩,起名为usb比较好

mkdir usb

然后把U盘插上,使用命令

fdisk -l

看看你的挂载的盘符,一般情况sda1是电脑的硬盘,sdb1是你刚刚插入的U盘
然后使用

mount /dev/sdc1 /mnt/usb

将U盘挂载到我们刚刚创建的目录。
这时候打开目录就可以看到U盘里面的东西了
千万要记住不用U盘了要卸载,而不是直接拔

umount /dev/sd1

网站接入https(nginx服务器)

公司的网站需要接入https,借此机会研究了下,小有所得,特此分享。
这第一步呢,自然是申请证书,这么高端大气上档次(也许还要花钱)的操作公司自然不会让我来搞,所以我直接到手的就是这个(免费的还是很好申请的,有需要请自行百度)
这里用nginx为例,打开nginx里面就是证书和key
首先把这两个证书放在服务器nginx安装目录下的一个文件夹里,文件夹名字随便起,不过为了便于识别,就叫做cert
服务器的配置超级简单,这里列出两种方法,我第二种成功了,第一种没有成功
第一种

server {
 listen 443;
 server_name localhost;
 ssl on;
 root html;
 index index.html index.htm;
 ssl_certificate cert/xxx.pem;注意这里,这样子写会报错,正确做法是写全路径/usr/local/nginx/cert/*******.crt;key也同样的写法,这里的pem文件和刚刚截图的crt文件是一个意思
 ssl_certificate_key cert/xxx.key;
 ssl_session_timeout 5m;
 ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
 ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
 ssl_prefer_server_ciphers on;
 location / {
 root html;
 index index.html index.htm;
 }
}

第二种方法
这种方法是我成功了的,也比较推荐,毕竟代码少~

 
server{
  listen 443 ssl;
  server_name _;
  ssl on;
  ssl_certificate /usr/local/nginx/cert/******.crt;
  ssl_certificate_key /usr/local/nginx/cert/*********.key;
}

搞完了保存退出就好了,重启下nginx,试试https访问。
但是你会发现直接输入网址,比如www.xxx.com是不会进入https的,这时候就需要写一个跳转规则
方法一:

rewrite ^(.*)$ https://$server_name$1 permanent;

方法二:适用于 80端口和443 配置在同一个 server{}内

if ($server_port = 80) {
  rewrite ^(.*)$ https://kaisuo.qbchoice.com$1 permanent;
}

配置完网站还需要注意的就是屏蔽掉IP访问。方法也很是简单

server 
{ 
listen 80 default; 
return 500; 
}

OneinStack 配置MySQL远程链接

公司有次配置新服务器,用的是oneinstack的一键包,装完之后想使用navicate链接数据库,结果发现链接不上,各种姿势报错,找了找原因顺便问了问公司大牛前辈,最后在oneinstack官方的解决方案里面找到了解决办法(结果是错的,两年前,情有可原)。在这里把我自己的解决方法记录下,以观后效。
首先官方的解释是:

可以理解嘛,也是为了我们的服务器安全考虑。
一.想要可以远程链接数据库,首先需要打开iptables3306端口
操作系统是centos系列:

iptables -I INPUT 4 -p tcp -m state --state NEW -m tcp --dport 3306 -j ACCEPT
service iptables save #保存iptables规则


操作系统如果是Ubuntu/Debian系列:

iptables -I INPUT 4 -p tcp -m state --state NEW -m tcp --dport 3306 -j ACCEPT
iptables-save > /etc/iptables.up.rules #保存iptables规则

二.数据库授权
总共有两种方法,分别是改表法和授权法,这里只介绍后一种。
这个数据库授权是我自己找到的方法,官方的sql写法有误
你想user使用password从任何主机连接到mysql服务器的话。注意:分号必须有
Sql代码
1. GRANT ALL PRIVILEGES ON *.* TO ‘user’@’%’ IDENTIFIED BY ‘password’ WITH GRANT OPTION;
2.FLUSH PRIVILEGES;
如果你想允许用户user从ip为192.168.1.6的主机连接到mysql服务器,并使用password作为密码
Sql代码
1. GRANT ALL PRIVILEGES ON *.* TO ‘user’@’192.168.1.3’ IDENTIFIED BY ‘password’ WITH GRANT OPTION;
2. FLUSH PRIVILEGES;
如果你想允许用户user从ip为192.168.1.6的主机连接到mysql服务器的dk数据库,并使用password作为密码
Sql代码
1. GRANT ALL PRIVILEGES ON dk.* TO ‘user’@’192.168.1.3’ IDENTIFIED BY ‘password’ WITH GRANT OPTION;
2. FLUSH PRIVILEGES;
注意授权后必须FLUSH PRIVILEGES;否则无法立即生效。

后来还找到一种新的方法,不过没有测试过,这里分享一下,有兴趣的可以试一下。
在安装mysql的机器上运行:
1、d:\mysql\bin\>mysql -h localhost -u root
//这样应该可以进MySQL服务器
2、mysql>GRANT ALL PRIVILEGES ON *.* TO ‘root’@’%’ WITH GRANT OPTION
//赋予任何主机访问数据的权限
3、mysql>FLUSH PRIVILEGES
//修改生效
4、mysql>EXIT
//退出MySQL服务器
这样就可以在其它任何的主机上以root身份登录啦!
其它:
mysql> grant all privileges on *.* to ‘energy_pf’@’192.168.2.65’ identified by ‘energy_pf’ with grant option;
Query OK, 0 rows affected (0.00 sec)
mysql> plush privileges;
允许用户energy_pf从ip为192.168.2.65的主机连接到mysql服务器的任意数据库(*.*),并使用energy_pf作为密码

MySQL 中case when的简单用法

之前写代码的时候遇到过这样一种情况,后台采集到的信息比如性别之类存在数据库里面是0或者1,当我们返回给前端的时候要么后台处理数据,要么前端判断一下将0 1转换为男女。就很麻烦,正所谓懒惰使人进步,终于是找到了一种快捷的方法,可以更加方便的返回对应的数据,就是使用mysql的case when语法。
写法为:

(case Gender when 1 then '男' when 2 then '女' else '其他' end)

不过需要注意的是如果有多个CASE WHEN表达式符合条件,将只返回第一个符合条件的子句,其余子句将被忽略。