Questions tagged «error-handling»

使用此标记可以解决有关如何处理Shell脚本中生成的错误的问题。

5
如何在Linux bash脚本中捕获错误?
我做了以下脚本: # !/bin/bash # OUTPUT-COLORING red='\e[0;31m' green='\e[0;32m' NC='\e[0m' # No Color # FUNCTIONS # directoryExists - Does the directory exist? function directoryExists { cd $1 if [ $? = 0 ] then echo -e "${green}$1${NC}" else echo -e "${red}$1${NC}" fi } # EXE directoryExists "~/foobar" directoryExists "/www/html/drupal" 该脚本有效,但是在我的回声旁边,当 cd $1 …

5
除非有错误,否则禁用cron电子邮件?
如果出现错误,我如何只接收来自cron的电子邮件? 在绝大多数情况下,任务将正常运行-我真的不在乎输出。 我仅想/需要知道失败的罕见情况。 我有可用的procmail-但不确定我所描述的内容是否可以从外部进行cron的“正确”管理。

5
抑制rsync中的服务器消息
当我rsync或scp从一台特定服务器上收到一条长消息时,会告诉我服务器规则。但是,当我设置常规提取时,我希望能够在日志中隐藏这些消息。浏览手册页建议这样做-q应该可行,但这只会使来自scp本身的消息安静下来。我怎样才能做到这一点?

3
有没有一种方法可以让我的bash脚本在任何命令错误时自动运行?
我正在编写一个需要执行一系列命令的shell脚本,每个命令都取决于每个先前的命令。如果有任何命令失败,则整个脚本将失败,我将调用退出函数。我可以检查每个命令的退出代码,但是我想知道是否存在可以启用的模式或一种使bash自动执行此操作的方法。 例如,使用以下命令: cd foo || myfunc rm a || myfunc cd bar || myfunc rm b || myfunc 有没有一种方法可以在执行这些命令之前以某种方式向外壳发出信号,如果它们中的任何一个失败,它应该调用myfunc,这样我可以编写一些更简洁的代码,例如: cd foo rm a cd bar rm b

4
静默磁盘错误和Linux交换的可靠性
我的理解是,硬盘驱动器和SSD会在驱动器内部实现一些基本的错误纠正,而大多数RAID配置(例如mdadm)将依赖于此来决定何时驱动器无法纠正错误并需要脱机。但是,这取决于存储的错误诊断准确率100%。事实并非如此,并且像两个驱动器的RAID-1镜像这样的常见配置将很容易受到攻击:假设一个驱动器上的某些位被静默损坏,并且该驱动器未报告读取错误。因此,诸如btrfs和ZFS之类的文件系统将实现其自己的校验和,以便不信任有故障的驱动器固件,故障SATA电缆等。 同样,RAM也可能存在可靠性问题,因此我们拥有ECC RAM来解决此问题。 我的问题是:如何保护Linux交换文件免受两磁盘配置(即,使用主线内核驱动程序)上的驱动器固件捕获的静默破坏/位腐的静默破坏/位腐烂?在我看来,此处缺少端到端保护的配置(例如btrfs提供的配置)在某种程度上抵消了ECC RAM带来的省心。但是我想不出一个好方法: btrfs根本不支持交换文件。您可以从btrfs文件设置一个循环设备,然后在该设备上进行交换。但这有问题: 随机写入效果不佳:https://btrfs.wiki.kernel.org/index.php/Gotchas#Fragmentation 关于禁用写时复制的建议也将禁用校验和-从而破坏了本练习的重点。他们的假设是数据文件具有自己的内部保护。 ZFS Linux上允许使用ZVOL作为交换,我想可以工作:http://zfsonlinux.org/faq.html#CanIUseaZVOLforSwap -然而,从我读书,ZFS通常苛刻的内存,并得到它的交换工作-仅应用程序听起来像一些工作来解决它。我认为这不是我的首选。为什么要为了可靠的交换而不得不使用树外内核模块,这超出了我的范围-在当今时代,对于大多数现代Linux发行版/内核,肯定有一种方法可以做到这一点? 有其实用的补丁,使内存管理器本身的校验,对于正是我在这个问题上讨论的原因,一个Linux内核邮件列表上的螺纹: http://thread.gmane.org/gmane.linux.kernel/989246 -不幸的是,据我所知,该补丁死了,并且从未出于我不知道的原因将其发布到上游。太糟糕了,听起来像是一个不错的功能。另一方面,如果将交换放在RAID-1上-如果损坏超出了校验和的修复能力,则希望内存管理器在出现紧急情况或其他原因之前尝试从其他驱动器读取数据。可能超出了内存管理器应做的工作范围。 综上所述: RAM具有ECC纠正错误 永久存储中的文件具有btrfs来更正错误 掉期有??? <---这是我的问题

2
ESRCH是什么意思?
不在:http : //pubs.opengroup.org/onlinepubs/9699919799/basedefs/errno.h.html 总是很清楚为什么将errno代码命名为一种特殊的方式。如何SRCH涉及到没有这样的进程?

1
如何测试Shell脚本的文件处理健壮性?
我已经编写了一个处理一些“常规”文件名的shell脚本,但是我读了为什么我的shell脚本为什么会在空白或其他特殊字符上出现问题?以及为什么不应该解析ls的输出,我希望它更加健壮并处理任何有效的文件名(和/或目录名)。如何创建文件和目录的测试平台来运行脚本?

3
最佳做法是使用$?猛击?
当我阅读有关$的答案时?另一个问题浮现在脑海。 是否有使用$的最佳做法?猛击? 让我们举个例子: 我们有一个线性脚本,我想知道所有命令都已正确执行。您是否认为可以调用一个小函数(将其称为“ did_it_work”)以检查错误代码,如果不是,则将其中断。 #!/bin/bash function did_it_work { code=$1 if [ "$code" -ne "0" ] then echo "Error failure: code $code " exit 1 fi } dir=some/path mkdir -p $dir did_it_work $? cd $dir did_it_work $? run_some_command did_it_work $? 当然,这种方法意味着我必须手动解决问题(如果有)并重新运行脚本。 您认为这是个好主意还是有其他最佳做法呢? /谢谢

4
blk_update_request:I / O错误,dev fd0,扇区0
我最近开始注意到blk_update_request: I/O error, dev fd0, sector 0在我用作服务器的运行Arch Linux的第二台计算机上的一些错误。这始于当我搬进新公寓时必须重新启动计算机。我有以下/etc/fstab配置: # # /etc/fstab: static file system information # # <file system> <dir> <type> <options> <dump> <pass> #UUID=94880e53-c4d3-4d4d-a217-84c9ac58f4fd /dev/sda1 / ext4 rw,relatime,data=ordered 0 1 #UUID=c1245aca-bbf7-4813-8c25-10bd0d95631e /dev/sda2 none swap defaults 0 0 #UUID=94880e53-c4d3-4d4d-a217-84c9ac58f4fd /dev/sdb1 /media/marcel/videos auto rw,user,auto 0 0 所以我的主硬盘挂载了/,我的外部硬盘挂载了/media/marcel/videos。问题在于,重新启动后,我的外部驱动器已安装/dev/sda,我的内部驱动器已安装/dev/sdb。据我所知,这台计算机可以正常启动,直到我看哪/media/marcel/videos一个是克隆的/。现在,我已拔下外部驱动器,而我只是想对主驱动器进行故障排除。 相关dmesg: ACPI Error: [CAPB] …

4
如果重定向失败,将不执行Bash程序
在bash中,我注意到,如果使用重定向的命令失败,则在此之前运行的任何程序都不会运行。 例如,此程序打开文件“ a”,并将50个字节写入文件“ a”。但是,运行此命令并将其重定向到权限不足的文件(〜root / log),文件大小“ a”不变。 $ ./write_file.py >> ~root/log -bash: /var/root/log: Permission denied cdal at Mac in ~/experimental/unix_write $ ls -lt total 16 -rw-rw-r-- 1 cdal staff 0 Apr 27 08:54 a <-- SHOULD BE 50 BYTES 有人会认为程序会运行,捕获所有输出(但也会写入文件“ a”),然后无法将任何输出写入〜root / log。而是永远不会运行该程序。 为什么会这样,bash在执行程序之前如何选择执行的“检查”的顺序?是否还要执行其他检查? ps我试图确定在cron下运行的程序在重定向到“权限被拒绝”文件时是否真的运行了。

1
什么是用于VMS DCL“ ON ERROR”的Linux?
使用VMS DCL命令脚本,可以使用以下on error命令捕获错误: $ on error then goto MyErrorHandler $ directory samiam.txt $ delete x.txt $ exit $MyErrorHandler: $ print "Something." 在Linuxland中如何做到这一点? 在此示例中,directory或错误delete将导致控制权转到MyErrorHandler。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.