[shell脚本]Linux自定义命令并启用应用

前言

之前做过一个Java Web系统,由很多的子系统组成,由尽管其子系统颇多,但是要在服务器上管理这些子系统(启动、停止、重启等)却很方便,只需要输入

1
tt
便能看见每个应用的名称、状态等,然后输入对应的应用名+操作代码,便能进行对应的操作,这一切都源于它使用了自定义的命令,来调用对应的shell脚本或命令。正好目前我做的一个系统,还处于起步阶段,每次部署都太麻烦,所以就做了一个类似的功能。

实现这个功能主要有两步:

  1. 创建相关操作的shell脚本;
  2. 自定义命令

1. 创建Shell脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#!/bin/bash
export APP_PATH=/usr/local/SmartDataStack
operate=${1}
#echo "${0}"
APP_NAME="sds"

pid=$(ps -aef | grep sds- | grep -v grep | awk '{print $2}')

startSDS(){

        if [ "$pid" == ""  ]; then
                echo -n "$APP_NAME starting: "
		
		for f in $APP_PATH/sds*.jar; do
  			sudo chown root:root $f && sudo chmod 775 $f
		done
		
		if [ "$?" == 0 ]; then 
			sudo sh $APP_PATH/start.prod.sh                      
			
			if [ "$?" -eq 0 ]; then
				
				echo "launch done, next will copy upload directory to $APP_PATH/tmp/webapp"
				sleep 10
				sudo cp -R $APP_PATH/upload $APP_PATH/tmp/webapp
				echo -e ""
				echo "Success"
			else
				echo "failure"
			fi

		else
			echo "failure, 'chown' && 'chmod failure'"
			echo -e ""
			exit 1
		fi
		
	else 
		echo "can't start SDS: SDS is running."
		echo -e ""
		exit 1       
        fi
}

stopSDS() {
	
	if [ "$pid" == "" ]; then
		echo "can't stop SDS: SDS is not running."
		echo -e ""
		exit 1
	fi

	echo -n "$APP_NAME stoping[pid: $pid]: "	

	# first copy upload dir
	sudo cp -R $APP_PATH/tmp/webapp $APP_PATH/upload && sudo kill $pid	

	# sudo kill `ps -aef | grep sds- | grep -v grep | awk '{print $2}'`
	
	if [ "$?" == 0 ]; then	
		sleep 5
		echo "success"
	else
		echo "failure"
		echo  -e ""
		exit 1
	fi
}

restartSDS() {
        
	echo "$APP_NAME restart..."
	# stopSDS
        # startSDS
	$0 stop
	$0 start
}

statusSDS() {
	
	#echo "------------------------------------------"
	echo "		pid	status	"
	echo "------------------------------"	

	if [ "$pid" == "" ]; then
		echo "$APP_NAME	$pid	stoped"
	else
		echo "$APP_NAME	$pid	started"
	fi
	
	
}

echo -e ""

case "$operate" in
	start)
		startSDS
		;;
	stop)
		stopSDS
		;;
	reload|restart)
		restartSDS
		;;
	status)
		statusSDS
		;;
	*)
		echo -e "Usage params: start|stop|status|restart|reload"
		;;
esac		

echo -e ""

exit 0

2. 配置别名(alias)

别名的配置可以分为两种,一种是只对自己生效,一种是对所有用户生效。

1.) 配置只对自己生效的别名

(1) 编辑~/.bashrc文件

1
sudo vim ~/.bashrc 

(2) 加入内容

1
alias sds="/usr/local/sh/sds.sh"

(3) 使配置生效

1
source ~/.bashrc

这时候使用sds即可查看效果,如下:

1
2
3
4
5
6
7
8
9
10
$ sds

Usage params: start|stop|status|restart|reload

$ sds status

                pid     status
------------------------------
sds				24019   started

如果显示没有此命令的话,查看是否有~/.bash_profile 文件,这个文件会加载~/.bashrc 文件,源码如下:

1
2
3
4
5
6
7
8
9
10
11
12
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:/root/bin:/sbin:/usr/sbin:/usr/script

export PATH

2.) 设置全局别名,对所有用户生效

上面的配置只能对当前用户有效,如果需要让所有的用户都能使用此别名,则需要使用下面的方法。

(1) 在/etc/profile.d 目录下新建文件(文件名自定义),例:

1
sudo vim /etc/profile.d/custom-aliases.sh

(2) 输入别名配置,例:

1
alias sds="/usr/local/sh/sds.sh"

(3) 保存文件

(4) 重新打开任何的terminals都可以使用这个别名了

1
2
3
4
5
6
7
8
9
10
$ sds

Usage params: start|stop|status|restart|reload

$ sds status

                pid     status
------------------------------
sds				24019   started

Enjoy!

参考资料

http://askubuntu.com/questions/610052/how-can-i-preset-aliases-for-all-users

一次 JVM 占用 CPU 资源过高的问题排查

* TOC{:toc}早晨刚到公司就收到服务器 CPU 持续飙高在 400% 左右的邮件。因为是新的服务器,上面只在一个 docker 中跑了一个 Java 应用,所以大致可以确定就是它的问题,接下来就是如何通过工具定位具体代码的问题了。大致的处理思路如下:1. 定位系统中...… Continue reading