![如果出现错误/警告,如何进行错误捕获和交换?](https://linux22.com/image/90817/%E5%A6%82%E6%9E%9C%E5%87%BA%E7%8E%B0%E9%94%99%E8%AF%AF%2F%E8%AD%A6%E5%91%8A%EF%BC%8C%E5%A6%82%E4%BD%95%E8%BF%9B%E8%A1%8C%E9%94%99%E8%AF%AF%E6%8D%95%E8%8E%B7%E5%92%8C%E4%BA%A4%E6%8D%A2%EF%BC%9F.png)
伪代码,其中 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 denied
sudo
- 在运行第一个大括号中的任何命令之前,如何让它先询问您的密码?
系统:Linux Ubuntu 16.04 64 位 Linux 内核:4.6
硬件:Macbook Air 2013-mid
相关主题:BASH 中的错误处理
答案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'
您不应该仅仅因为运行 matlab 就需要添加交换空间。或者任何其他程序。如果您需要或可能需要更多交换空间,那么只需将其添加到系统一次即可,例如,然后
/etc/fstab
忘记它。如果您可以调整分区大小,使交换分区比您认为需要的稍大,那么请这样做。如果不行,则在中添加交换文件
/etc/fstab
。如果交换到 SSD,您应该使用该
discard
选项,以便在每次重新启动时修剪块。例如/dev/sda4 none swap defaults,discard 0 0
该
discard
选项绝对适用于分区。我不确定它是否也适用于交换文件(我认为可以,但没有看到任何这样说的文档)如果硬件允许的话,比添加交换空间更好的是在系统中安装更多 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。
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 中再次出现可用空间。如果您已有交换分区,则可以
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
已经进入主线内核好几年了。zram
zswap
如果您还升级了 RAM,则可能会特别有用。例如,我最近将主系统升级到 32GB DDR3,并且还使用 SSD 交换分区,zswap
配置为允许最多 25% 的 RAM 用于交换。