Bash / Dash:在“If then else”语句中的“fi”上杀死进程?

Posted

技术标签:

【中文标题】Bash / Dash:在“If then else”语句中的“fi”上杀死进程?【英文标题】:Bash/Dash: Process killed on "fi" in an "If then else" statement? 【发布时间】:2017-05-13 16:17:13 【问题描述】:

我有以下脚本从我的 mysql 数据库中创建 SQL 转储。然后由 git 对文件进行历史记录。在这个脚本中,我遇到了一个奇怪的行为,即使经过一些研究,我也无法回答。

如果我运行脚本,我会收到一条错误消息,指出在第 25 行(即“fi”语句)进程“/usr/bin/git commit -m”$NOW”被终止:

xxx@xxx:/var/log# /opt/mysql_backup.sh 
[master 12fd643] 2016-12-29
/opt/mysql_backup.sh: Line 25: 11163 Killed                /usr/bin/git commit -m "$NOW"

在调试时,我注释掉了 if-then-else 语句,该语句检查 git 是否存在并且 scipts 运行时没有错误。

我的问题是: 为什么在“fi”语句中破折号“终止”git 命令?实际上提交是执行的,所以我想知道错误消息的原因可能是什么。该脚本在 Raspbian Jessie 的 dash 上运行。

提前致谢!

乔尔格

脚本:/opt/mysql_backup.sh

#!/bin/dash
# TARGET: Backup-Ziel
# IGNORE: Liste zu ignorierender Datenbanken (durch | getrennt)
# CONF: MySQL Config-Datei, welche die Zugangsdaten enthaelt
TARGET=/srv_ext/z_backup/mysql
IGNORE="phpmyadmin|mysql|information_schema|performance_schema|test"
CONF=/etc/mysql/debian.cnf
if [ ! -r $CONF ]; then /usr/bin/logger "$0 - auf $CONF konnte nicht zugegriffen werden"; exit 1; fi
if [ ! -d $TARGET ] || [ ! -w $TARGET ]; then /usr/bin/logger "$0 - Backup-Verzeichnis nicht beschreibbar"; exit 1; fi

DBS="$(/usr/bin/mysql --defaults-extra-file=$CONF -Bse 'show databases' | /bin/grep -Ev $IGNORE)"
NOW=$(date +"%Y-%m-%d")

for DB in $DBS; do
    /usr/bin/mysqldump --defaults-extra-file=$CONF --skip-extended-insert --skip-comments $DB > $TARGET/$DB.sql
done

if [ -x /usr/bin/git ] && [ -d $TARGET/.git/branches ]
then
  cd $TARGET
  /usr/bin/git add .
  /usr/bin/git commit -m "$NOW"
else
  /usr/bin/logger "$0 - git nicht verfuegbar oder Backup-Ziel nicht unter Versionskontrolle"
fi

/usr/bin/logger "$0 - Backup von $NOW erfolgreich durchgefuehrt"
exit 0

使用“set -x”运行的输出:

xxx@xxx:/opt# ./mysql_backup.sh 
+ TARGET=/srv_ext/z_backup/mysql
+ IGNORE=phpmyadmin|mysql|information_schema|performance_schema|test
+ CONF=/etc/mysql/debian.cnf
+ [ ! -r /etc/mysql/debian.cnf ]
+ [ ! -d /srv_ext/z_backup/mysql ]
+ [ ! -w /srv_ext/z_backup/mysql ]
+ /usr/bin/mysql --defaults-extra-file=/etc/mysql/debian.cnf -Bse show databases
+ /bin/grep -Ev phpmyadmin|mysql|information_schema|performance_schema|test
+ DBS=c_db
s1_db
s2_db
zabbix
+ date +%Y-%m-%d
+ NOW=2016-12-29
+ /usr/bin/mysqldump --defaults-extra-file=/etc/mysql/debian.cnf --skip-extended-insert --skip-comments c_db
+ /usr/bin/mysqldump --defaults-extra-file=/etc/mysql/debian.cnf --skip-extended-insert --skip-comments s1_db
+ /usr/bin/mysqldump --defaults-extra-file=/etc/mysql/debian.cnf --skip-extended-insert --skip-comments s2_db
+ /usr/bin/mysqldump --defaults-extra-file=/etc/mysql/debian.cnf --skip-extended-insert --skip-comments zabbix
+ [ -x /usr/bin/git ]
+ [ -d /srv_ext/z_backup/mysql/.git/branches ]
+ cd /srv_ext/z_backup/mysql
+ /usr/bin/git add .
+ /usr/bin/git commit -m 2016-12-29
[master b8952b9] 2016-12-29
Killed
+ /usr/bin/logger ./mysql_backup.sh - Backup von 2016-12-29 erfolgreich durchgefuehrt
+ exit 0

【问题讨论】:

你能否在 she-bang (#!/bin/dash) 之后添加一行 set -x 以在调试器模式下运行脚本并查看它失败的原因,假设你可以连续重现错误。跨度> @Inian:感谢您的关注!我添加了输出,错误消息是底部的第 3 行。 @Joerg Killed 表示 SIGKILL,通常是由于内存不足。 dmesg 是否显示内存不足错误?系统有多少可用 RAM? @jordanm 就是这样!很惭愧我没有想到这一点。当然,树莓派只有 1G,由于 SD 存储卡的磨损均衡,我没有启用交换。随着交换它的工作!非常感谢! 【参考方案1】:

当然,树莓派只有 1G,由于 SD 内存卡的磨损均衡,我没有启用交换。随着交换它的工作! ——约尔格

【讨论】:

以上是关于Bash / Dash:在“If then else”语句中的“fi”上杀死进程?的主要内容,如果未能解决你的问题,请参考以下文章

Ubuntu切换默认shell为bash或者dash

Linux shell语言——dash和bash

sh Ubuntu Dash to Bash(和返回):更改默认shell环境(因为Dash是一个精简Bash)

sh Ubuntu Dash to Bash(和返回):更改默认shell环境(因为Dash是一个精简Bash)

sh Ubuntu Dash to Bash(和返回):更改默认shell环境(因为Dash是一个精简Bash)

shell里一个let命令,用sh跑不了,但bash可以,发现bin里面sh是dash的链接,那么sh和bash功能上啥区别