スクリプトから呼び出されたアセンブラがcrontabで実行されたときに特定のファイルを生成しないのはなぜですか?

スクリプトから呼び出されたアセンブラがcrontabで実行されたときに特定のファイルを生成しないのはなぜですか?

私はそれを使用していますこのスクリプト私が開発したいくつかのアプリケーションをビルドしてパッケージ化します。スクリプトの内容全体が最後にリストされています。

このcrontabエントリによって呼び出されます。50 23 * * * nice $HOME/update-dl-wwwecm $HOME | tee -a $HOME/build-dl-wwwecm/log

デバッグのためにスクリプトをテストディレクトリにコピーし、~/test/20211101/t/少し編集しました。 (スクリプトの最後にハードコードされたパッケージを削除するのと同じです。)また、次のリポジトリをこのテストディレクトリmkdir build-dl-wwwecmのサブディレクトリに手動で配置しました。mkdir webreposhg clonewebrepos

  1. lmacros マクロコレクション(他のリポジトリを構築するために必要です。更新する最初のリポジトリとしてリストする必要があります。)

  2. l時計アプリケーション

  3. KEEPHOOKユーティリティ

  4. SHUFHOOKユーティリティ

次に、次のように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.shKEEPHOOKの全コンテンツ:

#! /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 スクリプトを実行するコマンドに。

関連情報