# shell脚本 **Repository Path**: no-one-knows/shell-script ## Basic Information - **Project Name**: shell脚本 - **Description**: 这里存放了我开发的shell脚本,都是一些对我自己而言非常实用的项目 - **Primary Language**: Shell - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2022-02-08 - **Last Updated**: 2023-06-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 1 数据库自动备份脚本部署教程 (MySQLAutoBack.sh) ### 1.1 功能介绍 * 自动全量备份MySQL数据库(一个月一个周期,具体每个月那一天可以在main函数更改) * 自动增量备份MySQL数据库(每天一次) * 自动每日推送备份数据到Gitee仓库 * 每一个小时才会检测一次时间,脚本基本没有资源占用 * 有备份日志 脚本备份文件默认存放文件夹在/home/SQLBack/MySQL(如果没有会自动创建)。需要更改的自行根据脚本更改。 **** > 下面是脚本部署 ### 1.2 git配置(非常重要) 因为git第一次推送到仓库必须输入账号密码。所以需要手动推送一次让git记住账号密码,这样脚本推送到Gitee时就不用输入账号密码了。 git配置是为了能够将备份数据推送到git仓库保存。如不需要云端备份,可以将`pushToGitee()`函数替换为空函数。 * 安装git,可使用`which git`查看是否安装。 * 设置gitconfig ```js git config --global user.name "用户名" git config --global user.email "邮箱" ``` * 切换到推送文件夹,依次输入以下命令完成仓库初始化推送,第一次运行脚本必需走的步骤。 ```js $ git config --global credential.helper store # 让git记住账号密码 $ git init $ git add. $ git commit -m "描述语" $ git push origin master -f ``` ### 1.3 脚本设置 ![image-20220208122958330](https://gitee.com/no-one-knows//images/raw/master/typroa_images/202202081229455.png) ### 1.3 脚本部署 * 编辑`/etc/rc.local或(/etc/rc.d/rc.local)` * 加入以下代码后保存 ```js nohup /home/MySQLAutoBack.sh & # 启动自动备份脚本 ``` /home/MySQLAutoBack.sh是一个绝对路径,此路径取决于自己将脚本放在哪里。 * 添加权限 ```js chmod 755 /etc/rc.local ``` 脚本部署完毕后重启服务器即可。不想重启服务器的使用以下命令直接运行脚本 ```js nohup /home/MySQLAutoBack.sh & ``` **注意:**不要重复多次执行该命令,这样会开启多个备份程序。 # shell脚本运行管理知识 ## 1 如何让脚本后台运行 使shell脚本后台执行,基本的方法有两种,第一种为在脚本后面追加&符号,第二种为在脚本前面使用`nohup`命令,结尾再追加`&`符号 **一、后台运行脚本1** 1、执行脚本test.sh:.`/test.sh` 2、中断脚本test.sh:`ctrl+c` 3、在1的基础上将运行中的test.sh,切换到后台并暂停:`ctrl+z` 4、执行ctrl+z后,test.sh在后台是暂停状态(stopped),使用命令:bg number让其在后台开始运行(“number”是使用jobs命令查到的 [ ]中的数字,不是pid) 5、直接在后台运行脚本test.sh:`./test.sh &` 6、查看当前shell环境中已启动的任务情况:`jobs` 7、将test.sh切换到前台运行:`fg %number`(”number”为使用jobs命令查看到的 [ ] 中的数字,不是pid) 8、中断后台运行的test.sh脚本:先`fg %number`切换到前台,再ctrl+c`;或是直接`kill %number` 以上两种在后台运行test.sh的方法,当遇到退出当前shell终端时,后台运行的test.sh也就结束了。这是因为以上两种方法使得test.sh在后台运行时,运行test.sh进程的父进程是当前shell终端进程,关闭当前shell终端时,父进程退出,会发送hangup信号给所有子进程,子进程收到hangup以后也会退出。所以要想退出当前shell终端时test.sh继续运行,则需要使用nohup忽略hangup信号。 **二、不中断后台运行脚本** 1、不中断的在后台运行test.sh:`nohup ./test.sh &`(test.sh的打印信息会输出到当前目录下的nohup.out中) 2、使用`jobs`可看到test.sh处于running状态 3、使用`ps -ef |grep test.sh`可查看到正在运行的test.sh脚本进程 4、退出当前shell终端,再重新打开,使用`jobs`看不到正在运行的test.sh,但使用`ps -ef`可以看到 5、在后台不中断的运行test.sh,可以使用`nohup`忽略hangup信号,或者使用setsid将其父进程改为init进程(进程号为1) 不中断的在后台运行test.sh另一个命令:`setsid ./test.sh &` 使用`ps -ef |grep test.sh`可看到test.sh进程的父进程id为1