我不是真正的編碼員。只需要自己的小腳本。
我希望每次關閉程式時都將家庭銀行的保存檔案復制到谷歌驅動器。復制腳本作業正常,但觸發器不起作用。
我想要回圈來檢查程式是打開還是關閉。但它不起作用,我無法理解該怎么做。
觸發代碼如下。
#! /bin/bash
cycle=0
open=$(ps -eo cmd | grep homebank)
echo "$open"
while [ $cycle = 0 ]
do
if [ "$open" = 'homebank grep homebank' ]
then [ $cycle = 1 ]
echo 'homebank was opened'
fi
done
while [ $cycle = 1 ]
do
if [ "$open" = 'grep homebank' ]
then
cycle=0
bash ~/.scripts/home-bank-updater
echo 'homebank was closed'
fi
done
非常感謝您的關注和幫助。
uj5u.com熱心網友回復:
我在這里看到了一些問題。首先,open=$(ps -eo cmd | grep homebank)將open變數設定為該命令的輸出,截至分配時。變數永遠不會更新,所以值永遠不會改變,重新測驗它只會一遍又一遍地給出相同的結果。要重新檢查,您需要重新運行該命令。
但無論如何,這是一種不好的檢查方式。一方面,輸出不會是homebank grep homebank; 它可能是,homebank<newline character>grep homebank或者grep homebank<newline character>homebank甚至可能是別的東西。pgrep如果可用,您最好使用它,因為它旨在消除此類問題。如果不是,請使用ps -eo cmd | grep '[h]omebank'-- 括號將阻止grep命令自身匹配,因此您只會看到您感興趣的程序。
而不是從pgrep/grep命令捕獲輸出,只需使用命令本身的退出狀態(并使用-q或>/dev/null丟棄輸出):
if pgrep homebank >/dev/null; then
或者
if ps -eo cmd | grep -q '[h]omebank'; then
其次,then [ $cycle = 1 ]不設定 的值cycle,而是對其進行測驗(并且不對結果執行任何操作)。你要then cycle=1。除了我會完全跳過該變數,并將pgrep結果用作回圈測驗(并添加延遲,因此它不會嘗試每微秒測驗一次):
until pgrep homebank >/dev/null; do
sleep 0.5
done
echo 'homebank was opened'
我不確定我是否理解第二個回圈的用途;是要等到homebank行程退出嗎?如果是這樣,它是多余的,因為第一個回圈已經等待,所以我只包括那些沒有回圈的行內步驟。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/392119.html
上一篇:有效地回圈遍歷地圖串列
