1、拷贝文件
在服务器建立一个目录,规划所有服务将运行在/data/service目录下,聊天室可以新建目录charservice
通过ssh连接到服务器,先跳转到根目录,执行
mkdir data
cd data
mkdir service
# 提升目录权限,否则会报Permission denied
chmod 777 service
cd service
开发机另起一个终端,执行scp命令将ChatService文件拷贝到服务端的/data/service 目录下
scp /users/用户名/ChatService root@192.168.0.120:/data/service
根据提示输入密码
ChatService 100% 2104KB 7.2MB/s 00:00
在ssh连接的终端上执行ls命令,查看文件
[root@rocky service]# ls
ChatService
新建chatservice目录,并将ChatService文件移到目录下
[root@rocky service]mkdir chatservice
[root@rocky service]mv ChatService chatservice/
[root@rocky service]cd chatservice
[root@rocky chatservice]ls
ChatService
修改ChatService权限,使其成为可执行文件
chmod 777 ChatService
再次执行ls命令,可以看到ChatService文件名字变为绿色。
2、执行程序
输入命令执行程序
[root@rocky chatservice]# ./ChatService
Asio server construct, listen port 21100
可以看到服务已经运行,并且监听21100端口。
启动测试客户端,尝试连接,
Start testclient...
exec exception:connect: Connection refused
提示连接被拒绝,这是因为服务端防火墙未开放端口。
3、打开端口
先检查防火墙状态
# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor>
Active: active (running) since Wed 2023-01-11 02:27:09 EST; 1 day 1h ago
Docs: man:firewalld(1)
Main PID: 899 (firewalld)
Tasks: 2 (limit: 48148)
Memory: 45.6M
CPU: 478ms
CGroup: /system.slice/firewalld.service
└─899 /usr/bin/python3 -s /usr/sbin/firewalld --nofork --nopid
防火墙firewalld正在运行,查看端口开放状态
# firewall-cmd --list-ports
显示空行,没有开放自定义端口。
增加端口21100,支持TCP连接
# firewall-cmd --zone=public --add-port=21100/tcp --permanent
success
重启防火墙,再查看端口状态,可以看到端口21100已经开放
# systemctl restart firewalld
# firewall-cmd --list-ports
21100/tcp
重启ChatService,再使用测试客户端尝试连接。
$ ./TestClient
Start testclient...
1
send msg len 8, length 0
recv msg 22
recv msg len:14 ,ori:2001, type:32869
recv msg RequestSessionID {"sesID":"1"}
please input cmd
2
send msg len 8, length 0
recv msg 40
recv msg len:32 ,ori:2001, type:32870
recv msg Create Room {"status":"0", "roomid":100000}
please input cmd
3
send msg len 26, length 18
recv msg 38
recv msg len:30 ,ori:2001, type:32871
recv msg Join Room {"status":0, "roomID":100000}
尝试请求SessionID,创建和加入房间,都能得到正确响应。
使用cat命令查看服务端日志
# cat ChatService.log
01/12/23 03:53:35 D4ADA1C0 [Info]
01/12/23 03:53:35 D4ADA1C0 [Info]ServiceBase Start ...
01/12/23 03:53:35 D4ADA1C0 [Info]ServiceBase Run
01/12/23 03:53:35 CB7FE640 [Info]Service Listen Port 21100
01/12/23 03:54:13 CB7FE640 [Trace]Service accept a new session
01/12/23 03:54:19 CB7FE640 [Info]create a ClientUser
01/12/23 03:54:19 CB7FE640 [Info]ClientUser::OnRequestSessionID: 1
01/12/23 03:55:03 CB7FE640 [Info]ClientUser::OnCreateRoom: 1, room 100000
01/12/23 03:55:07 CB7FE640 [Info]ClientUser::OnJoinRoom 1, {"roomID":100000}
服务已经正常运行了。
4、后台运行
现在执行ChatService的方式是在一个终端上直接执行程序,终端关闭后,程序也会终止。
4.1 nohup运行
想在后台执行的话,需要使用nohup命令:
nohup ./ChatService &
查看进程信息
# ps aux|grep ChatService
root 75976 0.1 0.1 305072 9424 pts/1 Sl 04:06 0:00 ./ChatService
中止程序可以使用kill命令,杀掉程序的进程号
# kill -9 75976
# ps aux|grep ChatService
4.2 创建启动脚本
使用nano命令,如果文件不存在,可以创建一个文件
[root@rocky eric]# cd /data/service/chatservice/
[root@rocky chatservice]# ls
ChatService
[root@rocky chatservice]# nano start.sh
输入启动命令
#!/bin/sh
nohup /data/service/chatservice/ChatService &
编辑完成后按Ctrl+x,提示保存已修改,输入“Y”,提示要保存的文件名,直接回车确认。
修改脚本权限
[root@rocky chatservice]# chmod 777 start.sh
尝试运行脚本
[root@rocky chatservice]# ./start.sh
[root@rocky chatservice]# nohup: 把输出追加到 'nohup.out'
[root@rocky chatservice]# ps aux | grep ChatService
root 2296 0.1 0.1 305072 9072 pts/0 Sl 05:36 0:00 ./ChatService
说明服务正常运行,先kill掉进程2296,下面配置服务。
5、注册服务
我们可以将ChatService注册为服务,程序就可以开机自动启动服务了。
5.1 创建service文件
[root@rocky eric]# cd /usr/lib/systemd/system
[root@rocky eric]# nano chatsvr.service
编辑内容
[Unit]
Description=ChatRoom Service
After=network.target
[Service]
User=root
Group=root
Type=simple
ExecStart=/data/service/chatservice/chatservice
WorkingDirectory=/data/service/chatservice
Restart=on-failure
[Install]
WantedBy=multi-user.target
Unit中After=network.target表示本服务在network服务启动后再运行。
保存退出后执行cat chatsvr.service 可以查看已经修改的文件。
提升可执行权限
chmod 777 chatsvr.service
5.2 启动服务
daemon-reload: 重新加载某个服务的配置文件,如果新安装了一个服务,归属于 systemctl 管理,要是新服务的服务程序配置文件生效,需重新加载。
#提升工作目录权限
[root@rocky system]# chmod -R 777 /data/service/chatservice/
[root@rocky system]# systemctl enable chatsvr.service #将服务加入到开机启动
Created symlink /etc/systemd/system/multi-user.target.wants/chatsvr.service → /usr/lib/systemd/system/chatsvr.service.
[root@rocky system]# systemctl daemon-reload
[root@rocky system]# systemctl start chatsvr.service
[root@rocky system]# systemctl status chatsvr.service
发现服务启动失败,报错信息为
code=exited, status=203/EXEC
查看日志发现是SELinux阻止
[root@rocky system]# tail -f /var/log/messages
修改文件标记,并使其生效
[root@rocky system]# ls -Z /data/service/chatservice/ChatService
unconfined_u:object_r:default_t:s0 /data/service/chatservice/ChatService
[root@rocky system]# semanage fcontext -a -t bin_t /data/service/chatservice/ChatService
[root@rocky system]# ls -Z /data/service/chatservice/ChatService
unconfined_u:object_r:default_t:s0 /data/service/chatservice/ChatService
[root@rocky system]# restorecon -v /data/service/chatservice/ChatService
Relabeled /data/service/chatservice/ChatService from unconfined_u:object_r:default_t:s0 to unconfined_u:object_r:bin_t:s0
[root@rocky system]# ls -Z /data/service/chatservice/ChatService
unconfined_u:object_r:bin_t:s0 /data/service/chatservice/ChatService
运行服务
[root@rocky system]# systemctl start chatsvr.service
[root@rocky system]# systemctl status chatsvr.service
● chatsvr.service - ChatRoom Service
Loaded: loaded (/usr/lib/systemd/system/chatsvr.service; enabled; vendor preset: disabled)
Active: active (running) since Fri 2023-01-13 08:02:41 EST; 29s ago
Main PID: 2378 (ChatService)
Tasks: 7 (limit: 48162)
Memory: 6.3M
CPU: 65ms
CGroup: /system.slice/chatsvr.service
└─2378 /data/service/chatservice/ChatService
查看服务进程
[root@rocky system]# ps aux | grep ChatService
root 2529 0.1 0.0 239536 7272 ? Ssl 08:05 0:00 /data/service/chatservice/ChatService
查看服务日志
[root@rocky system]# cat /data/service/chatservice/ChatService.log
01/13/23 08:05:46 CF1511C0 [Info]
01/13/23 08:05:46 CF1511C0 [Info]ServiceBase Start ...
01/13/23 08:05:46 CF1511C0 [Info]ServiceBase Run
01/13/23 08:05:46 C5120640 [Info]Service Listen Port 21100
执行reboot命令,重新启动服务器,查看情况
[root@rocky eric]# systemctl status chatsvr.service
● chatsvr.service - ChatRoom Service
Loaded: loaded (/usr/lib/systemd/system/chatsvr.service; enabled; vendor preset: disabled)
Active: active (running) since Fri 2023-01-13 08:11:15 EST; 56s ago
Main PID: 995 (ChatService)
Tasks: 10 (limit: 48162)
Memory: 6.9M
CPU: 105ms
CGroup: /system.slice/chatsvr.service
└─995 /data/service/chatservice/ChatService
ChatService服务随服务器开机自行启动。