bash脚本有时会出现“错误”;跳过;语句的前两个字符。如何排除故障?
我编写了一个bash脚本,它运行从远程暂存数据库到本地机器(我的Macbook)上的开发数据库的部分同步。脚本首先将某些表从临时数据库(通常通过SSH隧道)转储到本地.sql文件,然后针对本地数据库执行这些.sql文件。以下是脚本(一些表重命名以保护罪犯): 我首先打开一个ssh隧道,允许我访问远程(源)db,然后使用bash脚本有时会出现“错误”;跳过;语句的前两个字符。如何排除故障?,bash,Bash,我编写了一个bash脚本,它运行从远程暂存数据库到本地机器(我的Macbook)上的开发数据库的部分同步。脚本首先将某些表从临时数据库(通常通过SSH隧道)转储到本地.sql文件,然后针对本地数据库执行这些.sql文件。以下是脚本(一些表重命名以保护罪犯): 我首先打开一个ssh隧道,允许我访问远程(源)db,然后使用DATABASE\uURLenv-var集运行该脚本。正如您所看到的,我调用脚本的方式没有什么特别之处: # In one window, open an SSH tunnel s
DATABASE\uURL
env-var集运行该脚本。正如您所看到的,我调用脚本的方式没有什么特别之处:
# In one window, open an SSH tunnel so I can access the source db
ssh -NTL 55555:cello-staging.rds.amazonaws.com:5432 ubuntu@staging.cello.com
# In second window, run the script with DATABASE_URL set
DATABASE_URL=postgres://un:pw@localhost:55555/cello_staging sh bin/importdb.sh
其中一些表很大(4m+行),因此整个脚本可能需要几个小时才能完成。(是的,我确信有更好的方法为开发人员数据库种子。)
我的问题是::脚本经常(约60%的时间)失败,并出现错误,提示语句的某部分被“跳过”。一个例子:
# The failure message:
-bash: mp_table: command not found
# The statement at that line in the script:
dump_table admissions
另一个例子:
# The failure message:
bin/importdb.sh: line 65: port/admissions.sql: No such file or directory
# The statement at that line in the script:
psql -d cello_development -f export/admissions.sql
失败与我在该行运行语句时看到的一致,没有前两个字符(总是正好两个前导字符)。例如,如果我独立运行语句dump\u table
(假设定义了dump\u table
函数),我希望它会成功;但是如果我独立运行语句mp_table admissions
,我会看到与上面相同的失败消息
故障往往发生在两个特别大的表操作之后。但并非所有比较大的表都受到了比较大的影响
我最好的猜测是,不知何故,正在运行的昂贵的postgres DB操作导致bash脚本变得混乱,有时会在后续语句中“跳过”字符
我的问题:
- 您将如何对此进行故障排除?当bash脚本中的语句在执行之前(有时)被更改/缩短时
- 在执行bash脚本时,早期语句的副作用是否可能以某种方式影响脚本中后续语句的措辞
- 我正在运行的
&psql
命令是否可能与调用它们的脚本的内容交互pg_dump
编辑2:重写以包含正在运行的完整脚本以及我用来调用它的完整命令。我不明白是什么导致了这种情况,但有一些建议可以解决/避免它
- 在我看来,好像有什么东西在从shell中窃取输入。在出现问题之前,请尝试重定向命令的输入:
pg_dump $DATABASE_URL -s > export/_structure.sql </dev/null dump_table events </dev/null dump_table users </dev/null ...etc
顺便说一句,我建议在脚本的开头使用适当的shebang行,使其可执行(
chmod+xbin/importdb.sh
),然后不使用sh
命令直接运行。本质上,脚本的作者(通过脚本本身)应该定义脚本所用的语言/方言等,而不是运行脚本的人(/outer script/cron entry/whatever)。在正常运行和失败运行之间有什么变化吗?是否有人在脚本运行时修改脚本?脚本文件是否有可能在运行时被修改?或者是脚本本身修改,或者是其他人正在修改?您是否在问题发生前后检查了脚本文件的修改时间?您实际上是如何运行脚本的?看起来在shell执行脚本读取脚本的同时,有其他东西正在读取脚本。@chepner ITYM“有其他东西在同时编写脚本”。@Jens我已经看到了通过stdin传递脚本时的窃取输入效果,主要是在ssh连接上运行时,如sshuser@server对非常感谢。
pg_dump $DATABASE_URL -s > export/_structure.sql </dev/null
dump_table events </dev/null
dump_table users </dev/null
...etc
#!/bin/bash
if true; then # Workaround to avoid script reading weirdness
rm -rf export/
mkdir export
...
exit
fi