スクリプトインスタンスが1つだけ実行されていることを確認しますか?

スクリプトインスタンスが1つだけ実行されていることを確認しますか?

パスワード:

if [[ "`pidof -x $(basename $0) -o %PPID`" ]]; then exit; fi

元のコードソース:https://forum.rclone.org/t/continuous-syncing/12377/2

bashスクリプトのこのコードがbashスクリプトの1つのインスタンスのみを実行する方法を理解していません。

スクリプトのプロセスIDを取得する部分は理解していますが、その部分の目的をpidof -x $(basename $0)理解していません。-o %PPID

Q:コードがどのように機能するかを知っている人はいますか?

答え1

~によるとマニュアルページ見逃しましたpidof(私に知らせてくれた@casに感謝します):

-o omitpid
          Tells pidof to omit processes with that process id. The
          special pid %PPID can be used to name the parent process
          of the pidof program, in other words the calling shell or
          shell script.

したがって、-o %PPID現在実行中のスクリプトを無視し、そのスクリプトの他のインスタンス(存在する場合)のPIDを取得することを意味します。

コマンドを置き換えるために、バックティックと$()を混在させることなく元のコードを書き換えることができます。

#!/bin/bash

# ensure only one instance of script is running
if pidof -x $(basename $0) -o %PPID > /dev/null
then
    exit
fi

修正する:@Alfeが指摘したように、「とにかくpidof基盤を使用するbasename $0ことは、このチェックを実行する安全でない方法です。完全に異なる2つのプログラムが同じ基本名を持つことができます...」。以下は、pidファイルを使用する@Alfeアノテーションに基づく別のソリューションです。

#!/usr/bin/env bash

set -e

pid_file="fixed_name.pid"

# ensure only one instance of script is running
if [ -f "$pid_file" ] && ps -p $(cat "$pid_file") > /dev/null
then
    # another instance of this script is running
    exit
fi

# write script's PID to pid-file
printf "$$" > "$pid_file"

# do some work

有効なPIDが古いPIDファイルの他のプログラムに割り当てられる可能性があるため、このソリューションで問題を確認できます。もちろん、完璧な解決策はありません。しかし、これは私の元の質問から遠すぎます。

関連情報