パスワード:
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ファイルの他のプログラムに割り当てられる可能性があるため、このソリューションで問題を確認できます。もちろん、完璧な解決策はありません。しかし、これは私の元の質問から遠すぎます。