私はそれを使用していますこのスクリプト私が開発したいくつかのアプリケーションをビルドしてパッケージ化します。スクリプトの内容全体が最後にリストされています。
このcrontabエントリによって呼び出されます。50 23 * * * nice $HOME/update-dl-wwwecm $HOME | tee -a $HOME/build-dl-wwwecm/log
デバッグのためにスクリプトをテストディレクトリにコピーし、~/test/20211101/t/
少し編集しました。 (スクリプトの最後にハードコードされたパッケージを削除するのと同じです。)また、次のリポジトリをこのテストディレクトリmkdir build-dl-wwwecm
のサブディレクトリに手動で配置しました。mkdir webrepos
hg clone
webrepos
lmacros マクロコレクション(他のリポジトリを構築するために必要です。更新する最初のリポジトリとしてリストする必要があります。)
次に、次のようにcrontabに「毎分」行を追加しました。* * * * * nice $HOME/test/20211101/t/update-dl-wwwecm $HOME/test/20211101/t | tee -a $HOME/test/20211101/t/build-dl-wwwecm/log
更新スクリプトは、webreposサブディレクトリのリポジトリから着信コミットを確認します。次に、新しいコミットをインポートし、ビルドmak.sh
ディレクトリツリーで見つかったスクリプトファイルごとにそのファイルのディレクトリに変更し、そのファイルを実行します。これはmak.sh
KEEPHOOKの全コンテンツ:
#! /bin/bash
nasm -I ../lmacros/ -f bin transien.asm -l keephook.lst -o keephook.com "$@"
私が観察したのは、ユーザーとしてログインした状態でアップデートスクリプトを呼び出すと(sshを介して、画面内でbashを実行し、ConnectBotアプリを使用してサーバーに接続する)、すべてが期待どおりに機能することです。コマンドは次のとおりです。hg -R build-dl-wwwecm/keephook strip tip
(それで、更新スクリプトはインポートする新しいコミットを探します。)次に./update-dl-wwwecm "$PWD"
(BASEの引数をテストディレクトリとして指定して実際に更新を実行します。)
しかし、同じスクリプトがcrontabから呼び出された場合、1つは異なります。 NASMは完了したように見えるリストファイルをkeephook.com
生成しますが、出力ファイルを削除してから生成しないようです。keephook.lst
ログファイルにエラーや警告が見つかりませんでした。他のすべてのアプリはうまく構築されています。
なぜこれが起こり、どのように解決するのですか?
完全な更新スクリプトは次のとおりです。
#! /bin/bash
# Usage of the works is permitted provided that this
# instrument is retained with the works, so that any entity
# that uses the works is notified of this instrument.
#
# DISCLAIMER: THE WORKS ARE WITHOUT WARRANTY.
BASE="$1"
if [[ -z "$BASE" ]]
then
echo "Error: No base specified." >&2
exit 1
fi
SDIR="$BASE"/webrepos
[[ -n "$2" ]] && BASE="$2"
BDIR="$BASE"/build-dl-wwwecm
TDIR="$BASE"/wwwecm/download
ODIR="$BASE"/wwwecm/download/old
[[ ! -d "$BDIR" ]] && mkdir -p "$BDIR"
[[ ! -d "$TDIR" ]] && mkdir -p "$TDIR"
[[ ! -d "$ODIR" ]] && mkdir -p "$ODIR"
function update() {
# $1 = path below BDIR
# $2 = "-r" if there is a branch
# $3 = branch name if there is a branch
if [[ ! -d "$BDIR"/"$1" ]]
then
hg init "$BDIR"/"$1"
fi
cd "$BDIR"/"$1"
if var="$(hg incoming "$SDIR"/"$1" $2 $3)"; then
echo "$var"
hg pull "$SDIR"/"$1" $2 $3 && hg up $3
find . -name mak.sh -print0 | \
ONE="$1" xargs -r0 bash -c \
'for file; do echo === "$ONE"/"$file"; (cd "${file%/*}"; "./${file##*/}"); done' scriptlet
if [[ -f "$TDIR"/"$1".zip ]]
then
[[ ! -d "$ODIR"/"$1" ]] && mkdir -p "$ODIR"/"$1"
datestamp="$(date -r "$TDIR"/"$1".zip +%Y%m%d)"
echo === mv --backup=numbered "$TDIR"/"$1".zip "$ODIR"/"$1"/"$datestamp".zip
mv --backup=numbered "$TDIR"/"$1".zip "$ODIR"/"$1"/"$datestamp".zip
fi
echo === zipping "$1"
7za a -mm=deflate -mx=9 -tzip "$TDIR"/"$1".zip *
fi
}
update lmacros
update keephook
update shufhook
update rxansi
update lclock
update seekext
update tsr
update fdapm
update renumber
touch "$BDIR"/lastrun
答え1
質問の作成中に見つけました。 makスクリプトのstderrをstdoutにリダイレクトしていないためtee
。 1つはエラーメッセージがある場合です。また、エラーが発生した場合、NASMはリストファイルを削除すると誤って考えました.)
NASM version 2.14
ユーザーとして実行することとcrontabで実行することの奇妙な違いは、パス(crontabの場合、NASM version 2.15.03 compiled on Dec 28 2020
シェルセッションの場合)によって異なるNASMバージョンを使用することです。違いはこのlea di
指示このword
キーワードの使用は以前のバージョンでは拒否されますが、新しいバージョンでは許可されます。
更新スクリプトの修正は次のとおりです。2>&1
リダイレクトを追加make スクリプトを実行するコマンドに。