
私は小さなスクリプト(基本的に非常に簡単で、私が書いた最初のスクリプト)を持っており、経過時間と完了にかかった時間を知りたいです。
2つの変数の違いを計算することは可能ですか? ($SSSと$EEE)、$SECONDSも試してみましたが、結果は0でした。
別の方法があるかもしれませんが、この問題をどのように解決するのですか?
私のスクリプト:
echo "****************************************************************************"
SECONDS=0
#!/bin/bash
SSS=$(date '+%Y.%m.%d. @ %H:%M:%S')
echo "Start time: ${SSS}"
echo ""
echo "Starting update and upgrade"
echo "==================================="
sudo apt-get update && sudo apt-get upgrade -y
echo ""
echo "Starting autoremove"
echo "==================================="
sudo apt-get autoremove -y
echo ""
echo "Starting autoclean"
echo "==================================="
sudo apt-get autoclean -y
echo ""
echo "Check for Pi-Hole update"
echo "==================================="
sudo pihole -up
echo ""
echo "Starting gravity update for Pi-Hole"
echo "==================================="
sudo pihole -g
echo ""
EEE=$(date '+%Y.%m.%d. @ %H:%M:%S')
echo "Start time: ${SSS}"
echo "End time: ${EEE}"
duration=$SECONDS
echo "Elapsed time $(($duration / 60)) minutes and $(($duration % 60)) seconds."
echo "****************************************************************************"
答え1
スクリプトの問題はコマンドのタイミングとは関係ありません。スクリプトの問題は、コマンドラインで実行されている環境とは異なる環境で実行されていることです。
たとえば、PATH
変数が異なるため、一部のユーティリティが見つからない場合や、スクリプトが非対話型環境で実行されていると明らかに実行できない対話型要素がスクリプトに存在する可能性があります。
あなたも言及しました。コメントからsh
起動スクリプトの代わりに使用しますbash
。これは、変数が存在しない可能性があることを意味します(実行シェルによって異なりますSECONDS
)。sh
スクリプトがほとんど使用されていることがわかるので、sudo
権限のないユーザーアカウントのcrontabではなく、ルート自体のcrontabでスクリプトを実行する必要があることを示唆しています(sudo
スクリプトからすべての呼び出しを削除します)。 crontabを使用してrootユーザーを変更しますsudo crontab -e
。
PATH
また、使用するすべてのユーティリティを見つけるために、スクリプトの変数がディレクトリリストに設定されていることを確認してください。例えば、
#!/bin/bash
PATH=/bin:/usr/bin:/usr/local/bin:$PATH
SECONDS=0
apt-get update && apt-get upgrade
# etc.
PATH
特に、変数がそのディレクトリに含まれていることを確認する必要があります(コマンドラインでこれらのディレクトリを使用して検索します)。apt-get
pihole
command -v pihole
command -v apt-get
また、-lineがファイルの最初の行であることを確認してください#!
(例で見たように)。質問のコードはこれを行いません。注意してください -#!
はい完全に無視されるスクリプトを呼び出すときにコマンドラインで明示的なソルバーを使用する場合。