Fixed: MacOS Mojave(10.14) 解決終端用Crontab報許可權問題(不管是Root還是普通使用者)及Linux基礎(shell)

CRPER發表於2018-12-07

前言

對於一些系統以及專案依賴,個人都有跟進的習慣;

Macos內建launchctl來寫定時任務..不會...

還是選擇了Linux常用的crontab;


問題

這問題可能是系統安全策略的問題.我一開始嘗試了好久;

不管是用Root還是自身使用者..都會報Operation not permitted(任務沒法寫入);

開始沒想到是系統版本太新(安全策略)的問題,實在沒轍只能去找來同事一起排查,排除了語法還是其他一些問題,

還是有問題,我說要不去你電腦試試,他的是10.13(能正常執行).於是開始谷歌大法,終於在國外的論壇也有遇到類似的問題..

有說到關閉Rootless機制的,也有說新增硬碟操作許可權的,我選擇了後者;

我沒試過這個姿勢..有興趣的自己試試..

  • 新增硬碟訪問許可權的,就是把你的終端加進去這裡

Fixed: MacOS Mojave(10.14) 解決終端用Crontab報許可權問題(不管是Root還是普通使用者)及Linux基礎(shell)


Crontab的姿勢

crontab的用法還是很簡單的

  • -e: 就是進入編輯
  • -u: 指定使用者
  • -l: 列出排程清單
  • -r: 刪除排程任務

不帶使用者引數都是都是基於當前使用者來啟用crontab控制

語法格式:分鐘 小時 日 月 周 command shell_file

# demo
*/5 * * * * /bin/zsh /Users/linqunhe/Code/u-logs/autoShell.sh

# / 是每隔, 還支援 , - 這類指定和連續的..具體看對應的手冊吧

複製程式碼

指令碼的許可權記得設定好,比如你指定普通使用者的,744便足以

r:4 , w:2 ,x : 1 ;  u-g-o(自己/組/其他)

-rwxr--r--@ 1 linqunhe  staff   867B Dec  7 14:50 autoShell.sh

複製程式碼

我的排程需求很簡單,就是更新一些東西,有涉及到alias , 用到了zsh(因為寫在.zshrc)


#!/bin/zsh
source ~linqunhe/.zshrc
logPath="/Users/linqunhe/Code/u-logs/logs/$(date +'%Y-%m-%d').log"
echo '--------更新指令碼開始走起--------------' >> $logPath

# 更新NG專案
cd  /Users/linqunhe/Code/ng-sx-pc
ng update --all 2>&1 >> $logPath
echo '---------Ng Update End-------------' >> $logPath

# 更新nuxt專案
cd /Users/linqunhe/Code/nuxt2-sx-mobile-share
yarn outdated 2>&1 >> $logPath
yu 
echo '---------Nuxt Update End-------------' >> $logPath

# 更新umi專案(yu是我寫的alias)
cd /Users/linqunhe/Code/umi_dva_sx_admin
yarn outdated 2>&1 >> $logPath
yu 
echo '---------Umi Update End-------------' >> $logPath

# 更新老的react-sx-admin
cd /Users/linqunhe/Code/react-sx-admin
yarn outdated 2>&1 >> $logPath
yu 
echo '---------react-sx-admin Update End-------------'  >> $logPath



# 更新全域性的yarn npmyarn 
ygu 2>&1 >> $logPath
echo '---------yarn global  Update End-------------'  >> $logPath

# 列出全域性的npm 包
ygl 2>&1 >> $logPath
echo '---------yarn global list End-------------'  >> $logPath

# 更新brew && brew cask
brew prune
brew update 2>1 >> $logPath
brew upgrade 2>&1 >> $logPath
brew cask upgrade 2>&1 >> $logPath
echo '----------Brew && Brew Cask Update End------------' >> $logPath


# 更新MAC系統
softwareupdate -i -a 2>&1 >> $logPath
echo '--------Mac OS Update End--------------'  >> $logPath
echo '--------更新指令碼結束--------------' >> $logPath

是1,所以">/dev/null"等同於"1>/dev/null"
# 2 :表示stderr標準錯誤
# & :表示等同於的意思,2>&1,表示2的輸出重定向等同於1


複製程式碼

輸出就這樣了

  • 2018-12-07.log

Fixed: MacOS Mojave(10.14) 解決終端用Crontab報許可權問題(不管是Root還是普通使用者)及Linux基礎(shell)


總結

為什麼在本本寫任務排程,因為筆記本常年不關機..基本都是待機狀態,開蓋即用..

有不對之處請留言,會及時修正. 謝謝閱讀

相關文章