Bash

如果出現錯誤/警告,如何進行錯誤擷取和交換?

  • July 27, 2016

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=andcount=參數需要雙引號。其他的根本不需要引用,但如果你選擇引用它們,單引號更合適。

當您想在變數或參數中嵌入其他變數或命令替換時使用雙引號,固定字元串使用單引號。BTW 日期,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(大約 4x8GB DIMM $ 50 each). DDR4-based systems with 4 DIMM sockets can easily be upgraded to 64GB (4x16GB DIMMs at around $ 每個 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 / 開發 / zram0

如果您還有交換分區或交換文件,則可以使用它,但使用它更有意義,zswap因為沒有關於在 ZRAM 交換中保留什麼以及交換到磁碟的內容沒有“智能”。當 ZRAM 交換被填滿時,所有後續交換的數據都會進入磁碟,直到 ZRAM 中再次出現可用空間。 5. 如果您已經有一個交換分區,您可以使用zswap壓縮動態調整 RAM 記憶體到現有交換空間。您可以告訴它使用哪種壓縮算法,以及允許使用的最大 RAM 百分比。例如:

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

這將壓縮任何被換出的數據,當它接近最大 RAM 大小時,它開始在最近最少使用 (LRU) 的基礎上使用交換分區,因此最近使用的數據更有可能留在記憶體。

兩者zramzswap已經在主線核心中使用了幾年。

zram或者zswap如果您還升級 RAM,則可能特別有用。例如,我最近將我的主系統升級到 32GB 的 DDR3,並且還使用了一個 SSD 交換分區,zswap配置為允許最多 25% 的 RAM 用於交換。

引用自:https://unix.stackexchange.com/questions/297172