如果出现错误/警告,如何进行错误捕获和交换?

如果出现错误/警告,如何进行错误捕获和交换?

伪代码,其中 cas 注释后不完整的伪 try-catch

#!/usr/bin/env bash
# http://askubuntu.com/q/799834/25388    
# Use: `sh myScript`; sudo does not work with Matlab. 

#set -e # no rudimentary error checking
# https://stackoverflow.com/a/69808/54964

SWAP_FILE="/media/masi/SamiSwapVirtual/.swap_file_20.7.2016"
SIZE_MB="1000"
TO_RUN="matlab"

sudo dd if="/dev/zero" of="${SWAP_FILE}" bs="1M" count="${SIZE_MB}" status="progress"
sudo mkswap "${SWAP_FILE}"
sudo chmod 0600 "${SWAP_FILE}"
sudo chown root:root "${SWAP_FILE}" # http://unix.stackexchange.com/a/297153/16920

# TODO error-handling if any error, do swap
# Error-trapping here as here https://stackoverflow.com/a/185900/54964 ?   
# 
# My proposal where I am not sure about how to connect the commands inside the first block in braces
# 
# https://stackoverflow.com/a/22010339/54964
{
        sudo swapon -v "${SWAP_FILE}"
        echo "Swap enabled. Press enter to continue"; read
        "${TO_RUN}"
} || {
        echo "I will remove the swap. Press enter to continue"; read
        sudo swapoff -v "${SWAP_FILE}"
        rm -vf "${SWAP_FILE}"
        exit 1
}

echo "I will remove the swap. Press enter to continue"; read
sudo swapoff -v "${SWAP_FILE}"
rm -vf "${SWAP_FILE}"

输出

dd: failed to open '/media/masi/SamiSwapVirtual/.swap_file_20.7.2016': Permission denied
mkswap: cannot open /media/masi/SamiSwapVirtual/.swap_file_20.7.2016: Permission denied
chmod: changing permissions of '/media/masi/SamiSwapVirtual/.swap_file_20.7.2016': Operation not permitted
[sudo] password for masi: 

打开

  • dd有时会根据磁盘的情况mkswap给出。Permission deniedsudo
  • 在运行第一个大括号中的任何命令之前,如何让它先询问您的密码?

系统:Linux Ubuntu 16.04 64 位 Linux 内核:4.6
硬件:Macbook Air 2013-mid
相关主题:BASH 中的错误处理

答案1

  1. 运行 matlab 与管理交换空间完全分开,或者应该完全分开。您应该将交换创建/删除部分分离到一个单独的脚本中,然后使用sudo- 从命令行或主 matlab 运行脚本运行该脚本。

    您还应该在使用变量时引用它们,而不仅仅是在定义它们时。顺便说一句,由于您的变量是固定字符串,没有任何变量等插值,因此在定义它们时应该使用单引号。对于您的命令也是如此dd- 只有of=count=参数需要双引号。其他的根本不需要引用,但如果您选择引用它们,单引号更合适。

    当您想要在变量或参数中嵌入其他变量或命令替换时,请使用双引号,对于固定字符串,请使用单引号。顺便说一句,对于日期,YMD 排序正确。 DMY 没有。

    例如

    SWAPFILE="/$swappath/.swap_file_$(date +%Y%m%d)" SWAP_FILE='/media/masi/SamiSwapVirtual/.swap_file_20.7.2016'

  2. 您不应该仅仅因为运行 matlab 就需要添加交换空间。或者任何其他程序。如果您需要或可能需要更多交换空间,那么只需将其添加到系统一次即可,例如,然后/etc/fstab忘记它。

    如果您可以调整分区大小,使交换分区比您认为需要的稍大,那么请这样做。如果不行,则在中添加交换文件/etc/fstab

    如果交换到 SSD,您应该使用该discard选项,以便在每次重新启动时修剪块。例如

    /dev/sda4 none swap defaults,discard 0 0

    discard选项绝对适用于分区。我不确定它是否也适用于交换文件(我认为可以,但没有看到任何这样说的文档)

  3. 如果硬件允许的话,比添加交换空间更好的是在系统中安装更多 RAM。您在另一篇文章中提到您使用的是 Macbook Air,它具有焊接 RAM,因此不允许 RAM 升级。

    对于其他机器,这是最好的选择。具有 4 个 DIMM 插槽的基于 DDR3 的系统可以轻松且相当便宜地升级到 32GB(4 个 8GB DIMM,每个 50 美元左右)。具有 4 个 DIMM 插槽的基于 DDR4 的系统可以轻松升级到 64GB(4 个 16GB DIMM,每个 100 美元左右)。

    (对于在 .au 提供的产品,价格为近似价格(以澳元为单位),且为撰写本文时的最新价格)

    安装 16GB DDR3 DIMM 是可能的,但更难找到且更昂贵……价格差异足够大,可能值得只升级主板和 CPU 以获得 DDR4。

  4. zram可以使用你的一些RAM作为压缩RAM块设备。例如,对于使用最多 4GB RAM 的 zram 交换设备:

    modprobe zram num_devices=1
    回声 $((4 * 1024 * 1024 * 1024)) > /sys/block/zram0/disksize
    mkswap /dev/zram0
    交换 -p 100 /dev/zram0

    如果您还有交换分区或交换文件,则可以使用此选项,但使用它更有意义,zswap因为对于 ZRAM 交换中保存的内容以及交换到磁盘的内容没有“智能”。当 ZRAM 交换空间已满时,所有后续交换的数据都会写入磁盘,直到 ZRAM 中再次出现可用空间。

  5. 如果您已有交换分区,则可以zswap通过压缩将动态调整大小的 RAM 缓存添加到现有交换空间。您可以告诉它使用哪种压缩算法,以及允许使用的 RAM 的最大百分比。例如:

    echo 1 > /sys/module/zswap/parameters/enabled
    echo lz4 > /sys/module/zswap/parameters/compressor
    echo 50 > /sys/module/zswap/parameters/max_pool_percent

    这将压缩任何换出的数据,当它接近最大 RAM 大小时,它开始以最近最少使用 (LRU) 为基础使用交换分区,因此最近使用的数据更有可能保留在交换分区中。内存。

    zram和都zswap已经进入主线内核好几年了。

    zramzswap如果您还升级了 RAM,则可能会特别有用。例如,我最近将主系统升级到 32GB DDR3,并且还使用 SSD 交换分区,zswap配置为允许最多 25% 的 RAM 用于交换。

相关内容