作者 主題: shell 問題  (閱讀 4899 次)

0 會員 與 1 訪客 正在閱讀本文。

egg41230

  • 可愛的小學生
  • *
  • 文章數: 12
    • 檢視個人資料
shell 問題
« 於: 2018-10-26 14:40 »
請問一下唷~
如果我現在有兩隻shell,這兩隻shell 我不能同時執行,我該怎麼做比較好?

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17393
    • 檢視個人資料
    • http://www.study-area.org
Re: shell 問題
« 回覆 #1 於: 2018-10-26 15:56 »
用 ps aux 來 grep ?
或是用 lock file?

egg41230

  • 可愛的小學生
  • *
  • 文章數: 12
    • 檢視個人資料
Re: shell 問題
« 回覆 #2 於: 2018-10-26 16:02 »
所以我是不是要有一支專門的shell 來監控這兩隻shell 如果有兩隻同時執行的話,就要先做一隻就要先sleep?

dark

  • 俺是博士!
  • *****
  • 文章數: 1566
    • 檢視個人資料
Re: shell 問題
« 回覆 #3 於: 2018-10-27 16:52 »
應該要說 "兩隻 script"
shell 是指 /bin/csh , /bin/bash , /bin/sh ... 這些

這是我給 crond 執行的
代碼: [選擇]
nowps=$(ps ax)
if [ "$(echo "$nowps" | grep $(basename $0) | grep -vE "grep|^$(printf %5d $$)")" != "" ] ; then
echo $(basename $0) $$ is run > /dev/null
alertmsg="$(basename $0)":crond_重複執行
alert2logsev "$alertmsg" &>/dev/null
exit
fi

而一般手動在執行的 , 因為習慣會開很多 ssh , 人又健忘
怕同時寫檔時 , 寫入的檔就用 link
代碼: [選擇]
cmd=$(basename $0)
thispid=$$
dirfpath=$1
tmpln='/ram/tmpln_'$cmd'_'$(date +%s%N$RANDOM)
trap 'unlink "$tmpln";echo exit;exit' 1 2 3 15
ln -s "$dirfpath" "$tmpln"
(while $(sleep 10) ; do if [ "$(ps ax | grep $thispid | grep $cmd)" = "" ] ;then unlink "$tmpln" ; break ;fi ; done) &>/dev/null &

.....
最後一行
unlink "$tmpln"
手動的時後 , 手賤按 ctrl+c 的話 , 用 trap 監控 , 捕捉到這動作 unlink
但若程式錯誤而中斷 , 那就 while $(sleep) 來 unlink
同理 , touch 一個檔案 , 若存在就表示另一隻在執行


egg41230

  • 可愛的小學生
  • *
  • 文章數: 12
    • 檢視個人資料
Re: shell 問題
« 回覆 #4 於: 2018-10-29 09:01 »
好~謝謝大大的教學

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17393
    • 檢視個人資料
    • http://www.study-area.org
Re: shell 問題
« 回覆 #5 於: 2018-10-29 10:26 »
lock file 通常會搭配 trap 以及 boot up script 來清除

asako

  • 活潑的大學生
  • ***
  • 文章數: 235
    • 檢視個人資料
Re: shell 問題
« 回覆 #6 於: 2018-10-29 13:04 »
執行前找 pid 存不存在?

dark

  • 俺是博士!
  • *****
  • 文章數: 1566
    • 檢視個人資料
Re: shell 問題
« 回覆 #7 於: 2018-10-31 17:41 »
執行前找 pid 存不存在?

應該在說第一段 code 吧 ?

其實兩段 code 都有各自的缺點 , 改進方法各在彼此觀念中
那天剛好開來看理面的 url , 所以順手複製來貼

因為小弟習慣 $() => 子程序來執行
所以其時第一段中 grep -vE "grep|$$" => 這個 $$ 是子程序

而 ps ax | grep $$ 方式雖然直覺
但若是 script 很長 , 前段許多丟背景 , 那在中末段不容易找問題
所以 tmpstr=$(ps ax) 是檢視某一時間點的好方法

還有 ,
tmpid1=$_
tmpid2=$$
再拿來用都是好習慣 , 不過有時懶就沒多打了



netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17393
    • 檢視個人資料
    • http://www.study-area.org
Re: shell 問題
« 回覆 #8 於: 2018-11-01 13:09 »
執行前找 pid 存不存在?

那要先找個機制來記錄 PID 才行...

egg41230

  • 可愛的小學生
  • *
  • 文章數: 12
    • 檢視個人資料
Re: shell 問題
« 回覆 #9 於: 2018-11-07 15:31 »
好唷~謝謝大大了解做法了