Cron은 cron 내부에서 올바른 값을 에코하지 않지만 외부에서는 잘 작동합니다.

Cron은 cron 내부에서 올바른 값을 에코하지 않지만 외부에서는 잘 작동합니다.

crontab에도 포함시켰지만 source /home/user/.bashrc; <my scripts>여전히 올바른 결과가 출력되지 않았습니다.

내 스크립트에는 zend라는 서비스에서 일부 값을 확인하는 while 루프가 있습니다. 비트코인과 비슷하지만 Zen의 경우입니다. 기능은 이렇게 생겼어요.여기 check_existing_balance_withoutfl0보다 커야 하지만 cron에서 실행하면 0이라고 표시됩니다.

{

declare -i bal;
bal=0

while [ $bal -le 1 ]
do
    # #code to send zen to z addresses
    echo "Balance is $check_t_balance";
    logger "Balance is $check_t_balance";
    sleep 5

    # This following line is essential at this particular place
    export_address=$(zen-cli listaddresses | jq -r '.[2]');

    if python -c "import sys; sys.exit(0 if float($check_t_balance) <= float($min_ask_zen) else 1)"; # # for test
    # # if python -c "import sys; sys.exit(0 if float($check_t_balance) >= float($min_ask_zen) else 1)"; 

        # if [ $(bc <<< "$check_t_balance >= $min_ask_zen") -eq 1 ]; 

        then

        #statements

        echo "ZEN balance is sufficient"
        echo
        echo "We have received $check_t_balance zen in $export_address this t address"
        echo
        echo "Now, this will be sent to two z-addresses" && echo
        logger "Now, this will be sent to two z-addresses" && echo

        # # Recommended tx_fee is >= 0.0001
        # # Increse here if needed
        # tx_fee=0.0001;

        amt_aft_txfee=$(python -c "print(float($check_t_balance-$tx_fee))");
        amt=$(python -c "print(float($amt_aft_txfee/2))");
        echo "Sending now.... $amt ZEN to two z addresses"

        topUpzksnark;
        # # zen-cli z_sendmany $new_imported_address '[{"address": "'$(zen-cli z_getnewaddress)'", "amount": $amt},{"address": "'$(zen-cli z_getnewaddress)'", "amount": $amt}]';
        echo "$amt ZEN is sent to two Z addresses"

        else

            echo "ZEN balance is not suffiecient"
            moreZentoSend=$(python -c "print(float($min_ask_zen-$check_t_balance))")
            echo "Please send at least $moreZentoSend Zen to $export_address this address" >> /home/rock64/log.txt
            logger "Please send at least "$moreZentoSend" Zen to "$export_address" this address"

            echo "bal is $bal" >> /home/rock64/log.txt
    fi

    declare -i bal;
    declare -i check_existing_balance_withoutfl;
    echo "check_existing_balance_withoutfl is $check_existing_balance_withoutfl" >>/home/rock64/log.txt;
    check_existing_balance_withoutfl=$(zen-cli z_gettotalbalance | grep total | tr -d '," ' | cut -d ':' -f2 | tr -d '.' | bc);
    # check_existing_balance_withoutfl=$((10#$(zen-cli z_gettotalbalance | grep total | tr -d '," ' | cut -d ':' -f2 | tr -d '.')));
    # check_existing_balance_withoutfl=$((10#$check_existing_balance_withoutfl));
    bal+=$check_existing_balance_withoutfl;
    echo "check_existing_balance_withoutfl is $check_existing_balance_withoutfl" >>/home/rock64/log.txt;
    echo "bal is $bal after if else" >>/home/rock64/log.txt

done
}

>와 함께 sudo crontab -e사용할 때 로깅55 8 * * * source /home/rock64/.bashrc; /home/rock64/light.sh > /home/rock64/both.log 2>&1

check_existing_balance_withoutfl is 0
bal is 0 after if else
There is not enough balance in the node T Address 
check_existing_balance_withoutfl is 0
check_existing_balance_withoutfl is 0
bal is 0 after if else

crontab에서 스크립트를 실행하지 않으면 모든 것이 잘 작동합니다.

$ check_existing_balance_withoutfl=$(zen-cli z_gettotalbalance | grep total | tr -d '," ' | cut -d ':' -f2 | tr -d '.' | bc)
rock64@cheese:~$ echo $check_existing_balance_withoutfl
498

그렇다면 cron에서 실행될 때 bal 498이 아닌 이유는 무엇입니까? 나는 정말로 내가 무엇을 잘못했는지 모르겠습니다.

@Marcel이 제안한 대로 로그를 살펴본 후 bash -x문제를 발견한 것 같습니다. 스크립트를 에 넣었기 때문에 /home/root/.zen 디렉토리의 구성 파일을 참조하므로 zend 클라이언트의 경우 스크립트의 sudo crontab -e모든 줄을 바꿔야 합니다 . zen-cli누군가가 특정 거래 등을 확인하기 위해 crontab을 사용하려는 경우에도 zen-cli -conf=/home/user/.zen/zen.conf마찬가지입니다 .bitcoindbitcoin-cli

답변1

@Marcel이 제안한 대로 로그를 살펴본 후 bash -x문제를 발견한 것 같습니다.

왜냐하면 스크립트를 에 넣었기 때문에 디렉토리의 구성 파일을 sudo crontab -e참조합니다 ./home/root/.zen

zend그래서 클라이언트가 작동 sudo crontab -e하려면 스크립트 /etc/crontab의 모든 줄을 바꿔야 했습니다 zen-cli. zen-cli -conf=/home/<yourusername>/.zen/zen.conf에도 적용됩니다 bitcoind.

$USERin <yourusername>은 root 아래에 있으므로 사용하지 마십시오 sudo crontab -e. 따라서 사용자의 전체 이름을 사용하거나 변수에 사용자 이름을 지정하는 것이 좋습니다.

누군가 특정 거래나 시스템 시작이나 기타 기능 중에 비밀번호가 필요한 항목을 확인하기 위해 bitcoin-cliin을 사용하려는 경우 다음을 대체할 수 있습니다.sudo crontab -e

bitcoin-cli그리고bitcoin-cli -conf=/home/<yourusername>/.bitcoin/bitcoin.conf

예를 들어 다음을 수행하는 대신 최신 블록을 확인합니다.

bitcoin-cli getblockcount하다:

bitcoin-cli -conf=/home/<yourusername>/.bitcoin/bitcoin.conf getblockcount

관련 정보