吐槽
本来只是想在云服务器上开个tcp聊天室玩玩,可惜对Linux系统实在不了解,刚开始只在ssh窗口通过命令直接打开可执行文件,可惜窗口一关tcp服务器就停了。
后来了解到,想要他一直运行,要用脚本把这个可执行文件当做服务启动。然后去就去网上找代码,本以为这个肯定很简单,随便找个就行,没想到这么长,还有各种问题,不停的百度、修改、百度、修改,终于搞出来一个能用的,竟然也能大概了解一点各个语句的意思了,不过还是有很多不了解的地方。
过程
- cd /etc/init.d 跳转到这个目录
- sudo vim my_tcp 创建服务脚本,我这个名字叫my_tcp
- 输入以下代码,看得懂的地方我都注释了,还有不少不懂的,不过能用了。写完保存退出。
#!/bin/bash
## Fill in name of program here.
PROG="tcp_server" #需要启动的可执行文件名字
PROG_PATH="/home/bearpi/my_tcp" #可执行文件路径
PROG_ARGS="" #命令参数(我这里没有参数,就留空)
PID_PATH="/var/run" #PID路径(一般不需要改)
start() {
if [ -e "$PID_PATH/$PROG.pid" ]; then
# 如果该程序已经在运行(存在对应的pid文件),输出错误并退出
echo "Error! $PROG is currently running!" 1>&2 #标准输出重定向到标准错误
exit 1
else
## Change from /dev/null to something like /var/log/$PROG if you want to save output.
$PROG_PATH/$PROG $PROG_ARGS 2>&1 >/var/log/$PROG &
#上面这句话似乎是用来保存日志的,不过目前好像没保存什么东西,只新建了个文件,但是如果屏蔽了这句,就没法启动
pid=`ps -A |grep ${PROG}| awk '{print $1}'` #查找所有进程,搜索进程名称,取出第一个参数,即PID
echo "$PROG started"
echo $pid > "$PID_PATH/$PROG.pid" #将PID写入.pid文件
fi
}
stop() {
echo "begin stop"
if [ -e "$PID_PATH/$PROG.pid" ]; then
# 根据.pid文件是否存在来判断进程是否在运行
pid=`ps -A |grep ${PROG}| awk '{print $1}'` #查找PID,会找出所有该名字的PID,然后全部结束
kill $pid #根据PID结束进程
rm -f "$PID_PATH/$PROG.pid" #移除.pid文件
echo "$PROG stopped"
else
## Program is not running, exit with error.
echo "Error! $PROG not started!" 1>&2
exit 1
fi
}
## Check to see if we are running as root first.
## Found at http://www.cyberciti.biz/tips/shell-root-user-check-script.html
if [ "$(id -u)" != "0" ]; then #检查是否以root权限执行
echo "This script must be run as root" 1>&2
exit 1
fi
case "$1" in #根据参数判断应该执行哪一个函数
start)
start
exit 0
;;
stop)
stop
exit 0
;;
reload|restart|force-reload)
stop
start
exit 0
;;
**)
echo "Usage: $0 {start|stop|reload}" 1>&2
exit 1
;;
esac
4.sudo chmod +x /etc/init.d/my_tcp 给脚本添加可执行权限
5.sudo /etc/init.d/my_tcp start 启动