好吧,其實我是標題黨來的…
一篇解決實際問題的文章,順便帶你認識下一些Linux的命令以及簡單的shell腳本編程…
問題描述:
系統版本:Ubuntu 18.04.4 LTS
我的筆記本電腦外接了一個顯示器,本來以為和Windows下一樣,筆記本顯示器和外接顯示器會同步顯示,結果ubuntu下外接顯示器和筆記本顯示不一致,感覺像是被強制分屏了。體驗非常不好,感覺還影響了I/O設備,把外接顯示器拔了結果鼠標和鍵盤都不太能動了,重啟在沒外接顯示器的前提下鼠標和鍵盤才恢復正常。
問題解決方案: 一.關閉筆記本顯示器
輸入xrandr命令查看當前的顯示設備:
xrandr
xrandr簡介:
"xrandr" 是一款官方的 RandR (Resize and Rotate)X Window System 擴展配置工具。它可以設置屏幕顯示的大小、方向、鏡像等。
發現有兩個顯示設備,如下圖:
一個是eDP-1(筆記本顯示器),一個是HDMI-1(外接顯示器),于是用以下命令關閉了筆記本的顯示器,只用外接顯示器
xrandr --output HDMI-1 --auto --output eDP-1 --off
解釋: xrandr --output 要顯示的設備 --auto --output 要關閉的設備 --off
這樣舒服多了,但是一重啟,發現又回到原來的樣子,要再次手動使用以上命令…
每次開機都要這么手動輸一次命令才能關掉筆記本的顯示器,當然不爽啦,于是就想能不能在開機的時候讓系統自己跑個腳本運行這個命令。
二、用shell腳本執行關閉顯示器命令
怎么自動執行這個命令呢?當然想到了shell腳本啦。只要能在shell腳本中實現我們要做的事情,然后讓linux開機自動運行shell腳本,不必每次開機都要手動輸入命令才能關閉筆記本顯示器只顯示外接顯示器,就達到了我的目的。
所以我們需要做到兩件事情,一是我們需要讓腳本在開機時能自動運行,二是我們需要寫一個可以執行關閉顯示器命令的腳本
2.1 crontab設置系統定時任務
想做到讓Linux開機運行某個任務有幾種方式,這里我用了crontab命令。
通過crontab 命令,我們可以在固定的間隔時間執行指定的系統指令或 shell script腳本。時間間隔的單位可以是分鐘、小時、日、月、周及以上的任意組合。這個命令非常設合周期性的日志分析或數據備份等工作。
為了確保用crontab可以執行到我們的腳本,我們在某個路徑下新建腳本.sh,比如在/home/pipi/myshell下新建.sh
然后寫入最簡單的幾行:
#! /bin/bash
echo "exec scripts success" >>/home/pipi/myshell/crontablog.txt
exit 0
解釋: 1)#! /bin/bash 聲明這個腳本使用的shell名稱,當這個程序執行時,它能夠加載bash的相關環境配置文件,并且執行bash使得命令能夠執行,如果沒有設置好這一行,那系統可能會因為無法判斷該程序需要使用什么shell來執行而導致該程序無法執行。
2)echo "exec scripts success" >>/home/pipi/myshell/.txt 輸出exec scripts success這句話到.tx文件中去,>>表示在文件后追加,如果文件不存在會自動創建。
這個腳本的主要目的是為了驗證我們的shell腳本是否被執行到。執行前我們需要用chmod命令賦予文件執行權限:
chmod +x /home/pipi/myshell/authxrandr.sh
然后使用./.sh執行腳本,結果發現文件.txt成功追加一行exec scripts success
,說明我們的腳本可以正常執行。
解釋: 使用ls -l 以下命令可以查看文件權限等信息,其中r為可讀,w為可寫,x為可執行
ls -l /home/pipi/myshell/autoxrandr.sh
如果新建文件對當前用戶沒有可執行權限(x),直接使用./.sh就會出現下面的報錯:
注意: 這里最好要先驗證你的腳本是否有問題,至少需要用ls -l檢查下是否有執行權限
接下來我們用crontab -e 編輯當前用戶的時程表,首次打開編輯可能會讓你選擇用哪個編輯器,可以選擇nano(最簡單)或者vi進入。
我們在打開的文件里面加入這么一句:
@reboot /home/pipi/myshell/autoxrandr.sh
表示系統重啟時執行腳本.sh。
保存退出后重啟電腦驗證一下,如果重啟后你發現/home/pipi/myshell/.txt 多了一行
exec scripts success
那么說明我們成功的用crontab實現了系統重啟后執行我們編寫的shell腳本.sh。
2.2 寫一個可以執行關閉顯示器命令的腳本
經過一番研究,參考了國外一些Linux問答社區的回答, 新的.sh修改如下:
#! /bin/bash
export DISPLAY=:0
echo "start run scripts" >>/home/pipi/myshell/crontablog.txt
# wait until user signs on to get .Xauthority file settings.
UserName=""
while [[ $UserName == "" ]]; do
sleep 2
echo "waiting for user login" > /home/pipi/myshell/crontablog.txt
UserName="$(who -u | grep -F '(:0)' | head -n 1 | awk '{print $1}')"
done
sleep 10

xrandr --output HDMI-1 --auto --output eDP-1 --off
exit 0
解釋:
這個腳本做了幾件事情:
1)export DISPLAY=:0,設置當前用戶的圖形顯示的位置(當前機器),這是因為cron默認的環境變量設置不包括這個$DISPLAY
Cron limited set of by default . To get xrandr to work through a Cron job, you should export the value of the current user's $DISPLAY . To do that add the follow line to the of your script (or add it within the crontab file )
2)等待用戶登錄; 之所以要等待用戶登錄完再執行關閉顯示器操作的原因是系統需要時間尋找外接顯示器信號,否則找不到顯示器會導致我們的命令失敗,所以我們等待用戶登錄完再去執行關閉筆記本顯示器的命令;
3)xrandr 設置圖形輸出到外接顯示器HDMI-1,關閉顯示器eDP-1;
4)用echo輸出一些字符串到文件中,可以通過查看/home/pipi/myshell/.txt 驗證我們的程序是否執行到。
重啟驗證下,登錄后成功關閉了筆記本的顯示器!
總結:
1、xrandr簡介:%28%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87
2、crontab的簡介和例子:
3、chmod用于修改文件權限
4、ls -l 文件名
可以詳細列舉文件的權限等信息
5、export
用于設置或顯示環境變量
6、shell編程相關
1)#! /bin/bash
聲明這個腳本使用的shell名稱,當這個程序執行時,它能夠加載bash的相關環境配置文件,并且執行bash使得命令能夠執行,如果沒有設置好這一行,那系統可能會因為無法判斷該程序需要使用什么shell來執行而導致該程序無法執行。
2)如果新建文件對當前用戶沒有可執行權限(x),直接使用./.sh就會出現下面的報錯:
denied
7、參考鏈接:
1)國外問答社區類似的問題
2)為什么要添加export DISPLAY=:0
*請認真填寫需求信息,我們會在24小時內與您取得聯系。