- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章mysqld_safe启动脚本源码阅读、分析由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
前几天读了下mysqld_safe脚本,个人感觉还是收获蛮大的,其中细致的交代了MySQL数据库的启动流程,包括查找MySQL相关目录,解析配置文件以及最后如何调用mysqld程序来启动实例等,有着不错的参考价值;与此同时,脚本中涉及了很多shell编程中的小技巧,像变量解析,sed替换转义,进程优先级的判断以及无处不在test结构等等,当作Linux shell的学习素材还是非常合适的,下面是我的环境:
数据库版本: MySQL 5.1.45 操作系统版本: Red Hat Enterprise Linux AS release 4 (Nahant Update 3) MySQL基目录: /usr/local/mysql3306 配置文件目录: /usr/local/mysql3306/etc 。
数据库是安装好了的,代码如下:
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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
|
#!/bin/sh
# 一些状态变量的定义
KILL_MYSQLD=1;
# 试图kill多余的mysqld_safe程序,1表示需要kill
MYSQLD=
# mysqld二进制可执行文件的名称
niceness=0
# 进程的调度优先级标识
# 下面的变量主要用于标识不使用错误日志和syslog
logging=init
# 日志记录状态,init代表初始化
want_syslog=0
# 标识是否要使用syslog
syslog_tag=
user=
'mysql'
# --user选项值
pid_file=
# pid文件的路径
err_log=
# 错误日志的路径
# 这两个都是定义的syslog中标志位,在后面需要写入日志到syslog中时使用
syslog_tag_mysqld=mysqld
syslog_tag_mysqld_safe=mysqld_safe
trap
''
1 2 3 15
# 不允许程序在终端上被人打断(包括挂起,中断,退出,系统终止的情形)
umask
007
# 默认权限770,其他组用户对该程序创建的文件没有任何权限
# defaults变量记载使用的配置文件的信息
defaults=
case
"$1"
in
--no-defaults|--defaults-
file
=*|--defaults-extra-
file
=*)
defaults=
"$1"
;
shift
;;
esac
# usage()函数:使用--help选项时输出的使用帮助信息
usage () {
cat
<<EOF
Usage: $0 [OPTIONS]
--no-defaults Don't
read
the system defaults
file
--defaults-
file
=FILE Use the specified defaults
file
--defaults-extra-
file
=FILE Also use defaults from the specified
file
--ledir=DIRECTORY Look
for
mysqld
in
the specified directory
--
open
-files-limit=LIMIT Limit the number of
open
files
--core-
file
-size=LIMIT Limit core files to the specified size
--timezone=TZ Set the system timezone
--mysqld=FILE Use the specified
file
as mysqld
--mysqld-version=VERSION Use
"mysqld-VERSION"
as mysqld
--
nice
=NICE Set the scheduling priority of mysqld
--skip-
kill
-mysqld Don't try to
kill
stray mysqld processes
--syslog Log messages to syslog with
'logger'
--skip-syslog Log messages to error log (default)
--syslog-tag=TAG Pass -t
"mysqld-TAG"
to
'logger'
All other options are passed to the mysqld program.
EOF
exit
1
}
# my_which的作用相当于which,通过检索$PATH中的路径,打印出命令的全路径
# 这个函数就在后面一个地方用到了,就是my_which logger,意思等同于转换logger为/usr/bin/logger
my_which ()
{
save_ifs=
"${IFS-UNSET}"
# 保存当前的内建分隔符,用于后面重置IFS
IFS=:
# 使用 : 来分割PATH中的路径
ret=0
for
file
# 这种写法等同于for file in &*
do
for
dir
in
$PATH
do
if
[ -f
"$dir/$file"
]
then
echo
"$dir/$file"
continue
2
# continue 第 2 层, 这里就是跳出外层循环了
fi
done
ret=1
# signal an error
break
done
# 将设置过的IFS重置回去
if
[
"$save_ifs"
= UNSET ]
then
unset
IFS
else
IFS=
"$save_ifs"
fi
return
$ret
# Success
}
# 日志输出函数,这是个原型,后面被log_error和log_notice函数引用
log_generic () {
# priority 代表日志信息的分类,从后面的两个函数可知有:daemon.error和daemon.notice两种类别
priority=
"$1"
shift
# 日志中记录的msg前缀格式: 时间 + mysqld_safe ,类似于系统日志的记录格式
msg=
"`date +'%y%m%d %H:%M:%S'` mysqld_safe $*"
echo
"$msg"
case
$logging
in
init) ;;
# 初始化状态时,只在命令行输出msg信息,不记录日志
file
)
echo
"$msg"
>>
"$err_log"
;;
# 记录到err_log中
syslog) logger -t
"$syslog_tag_mysqld_safe"
-p
"$priority"
"$*"
;;
# 使用logger记录到系统日志中
*)
echo
"Internal program error (non-fatal):"
\
" unknown logging method '$logging'"
>&2
;;
esac
}
# 下面两个函数是对log_generic函数中不同分类的引用
log_error () {
log_generic daemon.error
"$@"
>&2
}
log_notice () {
log_generic daemon.notice
"$@"
}
# 后面就是用它启动的mysqld,通过logging变量区分记录日志的类型,分错误日志和系统日志syslog两种
# 最后的eval命令会解析 $cmd 中的值并执行命令
eval_log_error () {
cmd=
"$1"
case
$logging
in
file
) cmd=
"$cmd >> "
`shell_quote_string
"$err_log"
`
" 2>&1"
;;
syslog)
cmd=
"$cmd 2>&1 | logger -t '$syslog_tag_mysqld' -p daemon.error"
;;
*)
echo
"Internal program error (non-fatal):"
\
" unknown logging method '$logging'"
>&2
;;
esac
#echo "Running mysqld: [$cmd]"
eval
"$cmd"
}
# 转义函数,用于在非"a-z","A-Z","09",'/','_','.','=','-'的特殊字符前加上一个"\"
# sed中的\1代表引用前面\(\)中匹配的值
shell_quote_string() {
echo
"$1"
|
sed
-e
's,\([^a-zA-Z0-9/_.=-]\),\\\1,g'
}
# 该函数用于解析配置文件中的选项,并赋值给相应的变量
parse_arguments() {
pick_args=
if
test
"$1"
= PICK-ARGS-FROM-ARGV
then
pick_args=1
shift
fi
for
arg
do
# 取出参数值,比如 --port=3306 结果为: val = 3306 注意这里sed中使用;来分割,等同于/
val=`
echo
"$arg"
|
sed
-e
"s;--[^=]*=;;"
`
case
"$arg"
in
# 将参数值传递给对应的变量
--basedir=*) MY_BASEDIR_VERSION=
"$val"
;;
--datadir=*) DATADIR=
"$val"
;;
--pid-
file
=*) pid_file=
"$val"
;;
--user=*) user=
"$val"
; SET_USER=1 ;;
# 有些值可能已经在my.cnf配置文件的[mysqld_safe]组下设置了
# 某些值会被命令行上指定的选项值覆盖
--log-error=*) err_log=
"$val"
;;
--port=*) mysql_tcp_port=
"$val"
;;
--socket=*) mysql_unix_port=
"$val"
;;
# 接下来这几个特殊的选项在配置文件的[mysqld_safe]组中是必须设置的
# 我没配置这个组,所以就用不到了(使用mysqld中的默认)
--core-
file
-size=*) core_file_size=
"$val"
;;
--ledir=*) ledir=
"$val"
;;
--mysqld=*) MYSQLD=
"$val"
;;
--mysqld-version=*)
if
test
-n
"$val"
then
MYSQLD=
"mysqld-$val"
else
MYSQLD=
"mysqld"
fi
;;
--
nice
=*) niceness=
"$val"
;;
--
open
-files-limit=*) open_files=
"$val"
;;
--skip-
kill
-mysqld*) KILL_MYSQLD=0 ;;
--syslog) want_syslog=1 ;;
--skip-syslog) want_syslog=0 ;;
--syslog-tag=*) syslog_tag=
"$val"
;;
--timezone=*) TZ=
"$val"
;
export
TZ; ;;
# 生效了一下时区设置
--help) usage ;;
# 调用了usage函数,输出帮助信息
*)
if
test
-n
"$pick_args"
then
# 将其他命令行参数值附加到$arg的后面
append_arg_to_args
"$arg"
fi
;;
esac
done
}
########################################
# 正式工作开始了!!
########################################
#
# 下面两段是在寻找基目录和mysqld所在目录
#
# 找到/usr/local/mysql3306/share/mysql目录,使用relpkgdata来记录相对路径和绝对路径
# 这个grep其实应该是想判断一下share/mysql是不是显示的绝对路径,不知道这么写的意义在哪里。
if
echo
'/usr/local/mysql3306/share/mysql'
|
grep
'^/usr/local/mysql3306'
>
/dev/null
then
# 一口气用了三个替换,分别为:
# 第一步:将/usr/local/mysql3306转换为空
# 第二步:将/share/mysql开头的/转换为空
# 第三步:在share/mysql开头加上./,结果即:./share/mysql
relpkgdata=`
echo
'/usr/local/mysql3306/share/mysql'
|
sed
-e
's,^/usr/local/mysql3306,,'
-e
's,^/,,'
-e
's,^,./,'
`
else
relpkgdata=
'/usr/local/mysql3306/share/mysql'
fi
# 这一段都是在找mysqld文件,分别判断了libexec和bin目录
# 找不到就使用编译时的默认值
MY_PWD=`
pwd
`
if
test
-n
"$MY_BASEDIR_VERSION"
-a -d
"$MY_BASEDIR_VERSION"
then
if
test
-x
"$MY_BASEDIR_VERSION/libexec/mysqld"
then
ledir=
"$MY_BASEDIR_VERSION/libexec"
else
ledir=
"$MY_BASEDIR_VERSION/bin"
fi
# 这里对errmsg.sys文件进行了判断,个人认为这是为了确认当前目录为一个mysql安装基目录
elif
test
-f
"$relpkgdata"
/english/errmsg
.sys -a -x
"$MY_PWD/bin/mysqld"
then
MY_BASEDIR_VERSION=
"$MY_PWD"
ledir=
"$MY_PWD/bin"
elif
test
-f
"$relpkgdata"
/english/errmsg
.sys -a -x
"$MY_PWD/libexec/mysqld"
then
MY_BASEDIR_VERSION=
"$MY_PWD"
ledir=
"$MY_PWD/libexec"
else
MY_BASEDIR_VERSION=
'/usr/local/mysql3306'
ledir=
'/usr/local/mysql3306/libexec'
fi
#
# 接下来是找到配置文件和数据文件目录
#
# 找到配置文件目录
# 我的是放在了etc/目录下,mysqld程序是会读取到的
#
# 可以从my_print_defaults脚本中获得默认的读取my.cnf顺序,如下
# Default options are read from the following files in the given order:
# /etc/my.cnf /etc/mysql/my.cnf /home/mysql/mysql_master/etc/my.cnf ~/.my.cnf
# 或者可以使用strace -e open libexec/mysqld 2>&1 | grep my.cnf查看
if
test
-d $MY_BASEDIR_VERSION
/data/mysql
then
DATADIR=$MY_BASEDIR_VERSION
/data
if
test
-z
"$defaults"
-a -r
"$DATADIR/my.cnf"
then
defaults=
"--defaults-extra-file=$DATADIR/my.cnf"
fi
# 接下来找到数据文件的目录
elif
test
-d $MY_BASEDIR_VERSION
/var/mysql
then
DATADIR=$MY_BASEDIR_VERSION
/var
# 找不到就用编译时指定的默认值
else
DATADIR=
/usr/local/mysql3306/var
fi
# 对存在两个配置文件情况进行冲突处理
if
test
-z
"$MYSQL_HOME"
then
if
test
-r
"$MY_BASEDIR_VERSION/my.cnf"
&&
test
-r
"$DATADIR/my.cnf"
then
# 优先考虑 $MY_BASEDIR_VERSION/my.cnf 文件
log_error "WARNING: Found two instances of my.cnf -
$MY_BASEDIR_VERSION
/my
.cnf and
$DATADIR
/my
.cnf
IGNORING $DATADIR
/my
.cnf"
MYSQL_HOME=$MY_BASEDIR_VERSION
elif
test
-r
"$DATADIR/my.cnf"
then
log_error "WARNING: Found $DATADIR
/my
.cnf
The data directory is a deprecated location
for
my.cnf, please move it to
$MY_BASEDIR_VERSION
/my
.cnf"
MYSQL_HOME=$DATADIR
else
MYSQL_HOME=$MY_BASEDIR_VERSION
fi
fi
export
MYSQL_HOME
#
# 下面是使用bin/my_print_defaults读取my.cnf文件中的配置信息([mysqld] and [mysqld_safe])
# 并且和命令行中传入的参数进行合并
# 先是找到my_print_defaults执行文件 又是各种路径判断
if
test
-x
"$MY_BASEDIR_VERSION/bin/my_print_defaults"
then
print_defaults=
"$MY_BASEDIR_VERSION/bin/my_print_defaults"
elif
test
-x .
/bin/my_print_defaults
then
print_defaults=
"./bin/my_print_defaults"
elif
test
-x
/usr/local/mysql3306/bin/my_print_defaults
then
print_defaults=
"/usr/local/mysql3306/bin/my_print_defaults"
elif
test
-x
/usr/local/mysql3306/bin/mysql_print_defaults
then
print_defaults=
"/usr/local/mysql3306/bin/mysql_print_defaults"
else
print_defaults=
"my_print_defaults"
fi
# 这个函数可以将一个指定的参数附加到$arg中(在此同时执行了转义操作)
append_arg_to_args () {
args=
"$args "
`shell_quote_string
"$1"
`
}
args=
# 这里SET_USER=2是针对下面一条parse_arguments来说的
# 因为如果在紧接着的parse_arugments函数中设置了--user的值,那么SET_USER就会变为1,表示--user以被配置
# 当然如果没有读取到--user的值,就是说--user没有配置,那么会在后面的if结构中设置SET_USER为0
# 这样在后面的判断结构中,SET_USER的值 0代表没有配置--user的值,1代表已经配置
SET_USER=2
# 解析配置文件中的参数,使用--loose-verbose来过滤[mysqld]和[server]组中的内容
parse_arguments `$print_defaults $defaults --loose-verbose mysqld server`
if
test
$SET_USER -
eq
2
then
SET_USER=0
fi
# 又对[safe_mysqld]和[mysqld_safe]组中的内容进行了过滤读取
# 在我的配置文件中已经没有这两个组了,估计是为兼容旧版本的需要
parse_arguments `$print_defaults $defaults --loose-verbose mysqld_safe safe_mysqld`
# 用命令行输入选项 $@ 来覆盖配置文件中的选项 机智
parse_arguments PICK-ARGS-FROM-ARGV
"$@"
#
# 下面是logging工具的使用
#
# 判断logger工具是否可用
if
[ $want_syslog -
eq
1 ]
then
my_which logger >
/dev/null
2>&1
if
[ $? -
ne
0 ]
then
log_error
"--syslog requested, but no 'logger' program found. Please ensure that 'logger' is in your PATH, or do not specify the --syslog option to mysqld_safe."
exit
1
fi
fi
# 给err_log改名字。。。
if
[ -n
"$err_log"
-o $want_syslog -
eq
0 ]
then
if
[ -n
"$err_log"
]
then
# 下面是为err_log添加一个.err后缀(如果现在名字没有后缀)
# 如果不设置这个后缀,mysqld_safe和mysqld程序会将日志写入不同的文件中
# 因为在 mysqld 程序中,它将识别带有.的文件名为错误日志(脚本注释上说的)
# 这里的expr是识别文件名中“.”前面的字符总数量(包括.),如果没有设置后缀,返回就是0了
if
expr
"$err_log"
:
'.*\.[^/]*$'
>
/dev/null
then
:
else
err_log=
"$err_log"
.err
fi
case
"$err_log"
in
/* ) ;;
* ) err_log=
"$DATADIR/$err_log"
;;
esac
else
err_log=$DATADIR/`
/bin/hostname
`.err
fi
# 追加错误日志的位置选项
append_arg_to_args
"--log-error=$err_log"
# 发出错误提示:不要使用syslog
if
[ $want_syslog -
eq
1 ]
then
log_error
"Can't log to error log and syslog at the same time. Remove all --log-error configuration options for --syslog to take effect."
fi
# Log to err_log file
log_notice
"Logging to '$err_log'."
logging=files
# 正式把logging改成files 使用错误日志来记录日志
# 这个分支就是使用syslog的方法了
else
if
[ -n
"$syslog_tag"
]
then
# 设置各个syslog的使用标志位
syslog_tag=`
echo
"$syslog_tag"
|
sed
-e
's/[^a-zA-Z0-9_-]/_/g'
`
syslog_tag_mysqld_safe=
"${syslog_tag_mysqld_safe}-$syslog_tag"
syslog_tag_mysqld=
"${syslog_tag_mysqld}-$syslog_tag"
fi
log_notice
"Logging to syslog."
logging=syslog
fi
# 设置--user选项
USER_OPTION=
""
if
test
-w / -o
"$USER"
=
"root"
# 根目录是否可写,或者当前用户为root
then
if
test
"$user"
!=
"root"
-o $SET_USER = 1
then
USER_OPTION=
"--user=$user"
fi
# 创建错误日志,并将日志授权给指定的用户
if
[ $want_syslog -
eq
0 ];
then
touch
"$err_log"
chown
$user
"$err_log"
fi
# 这里它还对当前用户做了ulimit设置,包括可以打开的文件数量--open_files-limit选项
if
test
-n
"$open_files"
then
ulimit
-n $open_files
append_arg_to_args
"--open-files-limit=$open_files"
fi
fi
safe_mysql_unix_port={mysql_unix_port:-${MYSQL_UNIX_PORT:-
/usr/local/mysql3306/tmp/mysql
.sock}}
# 确保 $safe_mysql_unix_port 目录是存在的
mysql_unix_port_dir=`
dirname
$safe_mysql_unix_port`
if
[ ! -d $mysql_unix_port_dir ]
then
mkdir
$mysql_unix_port_dir
chown
$user $mysql_unix_port_dir
chmod
755 $mysql_unix_port_dir
fi
# 如果用户没有制定mysqld程序的名称,这里就默认赋值为mysqld
if
test
-z
"$MYSQLD"
then
MYSQLD=mysqld
fi
# 下面几段分别是对 mysqld , pid , port文件选项的检查和设置,省略100个字
if
test
! -x
"$ledir/$MYSQLD"
then
log_error "The
file
$ledir/$MYSQLD
does not exist or is not executable. Please
cd
to the mysql installation
directory and restart this script from there as follows:
.
/bin/mysqld_safe
&
See http:
//dev
.mysql.com
/doc/mysql/en/mysqld-safe
.html
for
more
information"
exit
1
fi
if
test
-z
"$pid_file"
then
pid_file=
"$DATADIR/`/bin/hostname`.pid"
else
case
"$pid_file"
in
/* ) ;;
* ) pid_file=
"$DATADIR/$pid_file"
;;
esac
fi
append_arg_to_args
"--pid-file=$pid_file"
if
test
-n
"$mysql_unix_port"
then
append_arg_to_args
"--socket=$mysql_unix_port"
fi
if
test
-n
"$mysql_tcp_port"
then
append_arg_to_args
"--port=$mysql_tcp_port"
fi
#
# 接下来是关于优先级的设置
#
if
test
$niceness -
eq
0
then
NOHUP_NICENESS=
"nohup"
else
NOHUP_NICENESS=
"nohup nice -$niceness"
fi
# 将当前的默认优先级设置为0
if
nohup
nice
>
/dev/null
2>&1
then
# normal_niceness记载默认的调度优先级
normal_niceness=`
nice
`
# nohup_niceness记载使用nohup执行方式的调度优先级
nohup_niceness=`
nohup
nice
2>
/dev/null
`
numeric_nice_values=1
# 这个for是为了检查$normal_niceness $nohup_niceness两个变量值的合法性
for
val
in
$normal_niceness $nohup_niceness
do
case
"$val"
in
-[0-9] | -[0-9][0-9] | -[0-9][0-9][0-9] | \
[0-9] | [0-9][0-9] | [0-9][0-9][0-9] )
;;
* )
numeric_nice_values=0 ;;
esac
done
# 这个判断结构很重要
# 它保证了使用nohup执行的mysqld程序在调度优先级上不会低于直接执行mysqld程序的方式
if
test
$numeric_nice_values -
eq
1
then
nice_value_diff=`
expr
$nohup_niceness - $normal_niceness`
if
test
$? -
eq
0 &&
test
$nice_value_diff -gt 0 && \
nice
--$nice_value_diff
echo
testing >
/dev/null
2>&1
then
# 进入分支说明$nohup_niceness的值比$normal_niceness大,即nohup执行方式调度优先级比正常执行方式低
# 这是不希望看到的,所以下面就人为的提升了nohup的优先级(降低niceness的值)
niceness=`
expr
$niceness - $nice_value_diff`
NOHUP_NICENESS=
"nice -$niceness nohup"
fi
fi
else
# 下面是测试nohup在当前系统中是否可用,不可用的话就置空NOHUP_NICENESS
if
nohup
echo
testing >
/dev/null
2>&1
then
:
else
NOHUP_NICENESS=
""
fi
fi
# 指定内核文件大小
if
test
-n
"$core_file_size"
then
ulimit
-c $core_file_size
fi
#
# 如果已经存在一个pid文件,则检查是否有已经启动的mysqld_safe进程
if
test
-f
"$pid_file"
then
PID=`
cat
"$pid_file"
`
if
/bin/kill
-0 $PID >
/dev/null
2>
/dev/null
then
if
/bin/ps
wwwp $PID |
grep
-
v
" grep"
|
grep
-
v
mysqld_safe |
grep
--
"$MYSQLD"
>
/dev/null
then
log_error
"A mysqld process already exists"
exit
1
fi
fi
# 下面是处理办法:删除旧的pid文件并报错
rm
-f
"$pid_file"
if
test
-f
"$pid_file"
then
log_error "Fatal error: Can't remove the pid
file
:
$pid_file
Please remove it manually and start $0 again;
mysqld daemon not started"
exit
1
fi
fi
#
# 下面便是拼接执行语句运行了。
#
cmd=
"$NOHUP_NICENESS"
# 检查一下命令 并进行转义操作
for
i
in
"$ledir/$MYSQLD"
"$defaults"
"--basedir=$MY_BASEDIR_VERSION"
\
"--datadir=$DATADIR"
"$USER_OPTION"
do
cmd=
"$cmd "
`shell_quote_string
"$i"
`
done
cmd=
"$cmd $args"
# Avoid 'nohup: ignoring input' warning
test
-n
"$NOHUP_NICENESS"
&& cmd=
"$cmd < /dev/null"
log_notice
"Starting $MYSQLD daemon with databases from $DATADIR"
# 后台循环 执行mysqld
while
true
do
rm
-f $safe_mysql_unix_port
"$pid_file"
# 保险起见,又删除了一次pid文件
# 调用eval_log_error函数,传入$cmd参数的值,最后使用eval命令执行了启动mysqld
eval_log_error
"$cmd"
if
test
! -f
"$pid_file"
# 没有成功创建pid文件,则退出分支
then
break
fi
# mysqld_safe已经启动的处理方法,保证只有一个mysqld_safe程序启动
if
true
&&
test
$KILL_MYSQLD -
eq
1
then
# 统计启动的mysqld进程的数目
numofproces=`
ps
xaww |
grep
-
v
"grep"
|
grep
"$ledir/$MYSQLD\>"
|
grep
-c
"pid-file=$pid_file"
`
log_notice
"Number of processes running now: $numofproces"
I=1
while
test
"$I"
-
le
"$numofproces"
do
# 这个PROC的数据即是ps mysqld_safe程序的输出 第一个数字即为进程ID
PROC=`
ps
xaww |
grep
"$ledir/$MYSQLD\>"
|
grep
-
v
"grep"
|
grep
"pid-file=$pid_file"
|
sed
-n
'$p'
`
# 使用T来获取进程ID
for
T
in
$PROC
do
break
done
# kill掉该个mysqld_safe程序
if
kill
-9 $T
then
log_error
"$MYSQLD process hanging, pid $T - killed"
else
break
fi
# 每干掉一个mysqld_safe就把I加一,这样没有多余的mysqld_safe时就可以跳出循环了
I=`
expr
$I + 1`
done
fi
log_notice
"mysqld restarted"
done
# 完结撒花
log_notice
"mysqld from pid file $pid_file ended"
|
。
最后此篇关于mysqld_safe启动脚本源码阅读、分析的文章就讲到这里了,如果你想了解更多关于mysqld_safe启动脚本源码阅读、分析的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我刚刚继承了一个旧的 PostgreSQL 安装,需要进行一些诊断以找出该数据库运行缓慢的原因。在 MS SQL 上,您可以使用 Profiler 等工具来查看正在运行的查询,然后查看它们的执行计划。
将目标从Analytics(分析)导入到AdWords中,然后在Analytics(分析)中更改目标条件时,是否可以通过更改将目标“重新导入”到AdWords,还是可以自动选择? 最佳答案 更改目标值
我正在使用google analytics api来获取数据。我正在获取数据,但我想验证两个参数,它们在特定日期范围内始终为0。我正在获取['ga:transactions']和['ga:goalCo
我使用Google API从Google Analytics(分析)获取数据,但指标与Google Analytics(分析)的网络界面不同。 即:我在2015年3月1日获得数据-它返回综合浏览量79
我在我的Web应用程序中使用sammy.js进行剔除。我正在尝试向其中添加Google Analytics(分析)。我很快找到了following plugin来实现页面跟踪。 我按照步骤操作,页面如
当使用 Xcode 分析 (product>analyze) 时,有没有办法忽略给定文件中的任何错误? 例如编译指示之类的? 我们只想忽略第三方代码的任何警告,这样当我们的代码出现问题时,它对我们
目录 EFK 1. 日志系统 2. 部署ElasticSearch 2.1 创建handless服务 2.2 创建s
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve thi
GCC/G++ 是否有可用于输出分析的选项? 能够比较以前的代码与新代码之间的差异(大小、类/结构的大小)将很有用。然后可以将它们与之前的输出进行比较以进行比较,这对于许多目的都是有用的。 如果没有此
我正在浏览 LYAH,并一直在研究处理列表时列表理解与映射/过滤器的使用。我已经分析了以下两个函数,并包含了教授的输出。如果我正确地阅读了教授的内容,我会说 FiltB 的运行速度比 FiltA 慢很
在 MySQL 中可以使用 SET profiling = 1; 设置分析 查询 SHOW PROFILES; 显示每个查询所用的时间。我想知道这个时间是只包括服务器的执行时间还是还包括将结果发送到前
我用 Python 编写了几个用于生成阶乘的模块,我想测试运行时间。我找到了一个分析示例 here我使用该模板来分析我的模块: import profile #fact def main():
前几天读了下mysqld_safe脚本,个人感觉还是收获蛮大的,其中细致的交代了MySQL数据库的启动流程,包括查找MySQL相关目录,解析配置文件以及最后如何调用mysqld程序来启动实例等,有着
上一篇:《人工智能大语言模型起源篇,低秩微调(LoRA)》 (14)Rae 和同事(包括78位合著者!)于2022年发表的《Scaling Language Models: Methods, A
1 内网基础 内网/局域网(Local Area Network,LAN),是指在某一区域内有多台计算机互联而成的计算机组,组网范围通常在数千米以内。在局域网中,可以实现文件管理、应用软件共享、打印机
1 内网基础 内网/局域网(Local Area Network,LAN),是指在某一区域内有多台计算机互联而成的计算机组,组网范围通常在数千米以内。在局域网中,可以实现文件管理、应用软件共享、打印机
我有四列形式的数据。前三列代表时间,value1,value 2。第四列是二进制,全为 0 或 1。当第四列中对应的二进制值为0时,有没有办法告诉excel删除时间、值1和值2?我知道这在 C++ 或
我正在运行一个进行长时间计算的 Haskell 程序。经过一些分析和跟踪后,我注意到以下内容: $ /usr/bin/time -v ./hl test.hl 9000045000050000 Com
我有一个缓慢的 asp.net 程序正在运行。我想分析生产服务器以查看发生了什么,但我不想显着降低生产服务器的速度。 一般而言,配置生产盒或仅本地开发盒是标准做法吗?另外,您建议使用哪些程序来实现这一
我目前正在尝试分析 Haskell 服务器。服务器永远运行,所以我只想要一个固定时间的分析报告。我尝试只运行该程序 3 分钟,然后礼貌地要求它终止,但不知何故,haskell 分析器不遵守术语信号,并
我是一名优秀的程序员,十分优秀!