【问题标题】:Bash script hangsBash 脚本挂起
【发布时间】:2011-08-07 06:55:49
【问题描述】:

我有下面的代码。基本上这段代码将ls -tr $FROM_DIRECTORY 然后将输出重定向到/tmp/msc.load.tmp。在此之后,for 循环将执行并将前 3000 个文件移动到另一个目录。代码运行良好,但有时会挂起。我不知道它为什么挂起。有谁知道脚本的问题是什么?

ls -tr $FROM_DIRECTORY > /tmp/msc.load.tmp
echo "$sysdate -- Listing Diretory " >>$LOGFILE
# From the file list, get the 3000 from the top to move. Skip the remaining files in the list 
# in this iteration. 
# Version 1.1 - List the files from the temporary file.  
for file in $(cat /tmp/msc.load.tmp | grep 'MSCERC.*' | head -3000 )
do 
   mv $FROM_DIRECTORY/$file $DESTINATION_DIRECTORY
done
echo "$sysdate -- End of Script " >>$LOGFILE
exit 0
# End of script.

【问题讨论】:

  • 最好只使用find命令,省去中间文件。
  • 使用“bash -x”运行它,这样您就可以看到它挂起的位置和原因
  • 我是 unix 新手。我知道如何在脚本中添加 -x 吗?可以举个例子吗?
  • cathead 和正则表达式通配符都是不必要的。另外,don't read lines with for.grep -m 3000 MSCERC /tmp/msc.load.tmp | while read -r file; do...最后,quote your variables.

标签: bash unix scripting


【解决方案1】:

是的,请尝试查找。

另外,如果您不知道,set -x 命令在这种情况下很有价值。我的方法是将 set -x 添加到脚本的顶部,然后将输出重定向到文件来运行它。捕获标准输出和标准错误

./script.sh > output.txt 2>&1

如果您愿意,可以在另一个窗口中使用 tail -f output.txt 来监控进度。

Set -x 回显命令运行,重定向将命令和输出按时间顺序排列。

【讨论】:

  • 哪一部分保证stdout和stderr按时间顺序排列?
  • 按时间顺序写行。与尝试在没有 stderr 部分的情况下尝试将来自控制台的 stderr 和来自重定向的 stdout 相关联。
  • 但是仍然不能保证它们会被同步写出。我的意思是,是的,这比让它们去两个不同的目的地要好,但是如果流被淹没,那么它们不一定会按顺序输出。但我想提问者将不得不抓住机会。
  • 我是 unix 新手。我可以知道如何在脚本顶部设置 -x 吗?可以举个例子吗?
  • 要么使用 -x 参数调用脚本,如 hmontoliu 上面所说,要么编辑脚本并在 ls -tr $FROM_DIRECTORY > /tmp/msc.load.tmp enter set -x
猜你喜欢
  • 2014-07-05
  • 2014-04-07
  • 2018-04-21
  • 2015-03-01
  • 1970-01-01
  • 2015-04-07
  • 2022-11-10
  • 2013-09-17
  • 2013-09-28
相关资源
最近更新 更多