lawn-hark: Parallelization using xargs(1). - gopher-lawn - The gopher lawn goph… | |
git clone git://bitreich.org/gopher-lawn/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhf… | |
Log | |
Files | |
Refs | |
Tags | |
--- | |
commit e3cc5279072ddbee7f2d58152732c759a9ede582 | |
parent b9a49018389fa0126149e3cbef3ecdef4defe6ef | |
Author: Julian Schweinsberg <[email protected]> | |
Date: Tue, 19 Dec 2023 20:25:02 +0100 | |
lawn-hark: Parallelization using xargs(1). | |
Signed-off-by: Christoph Lohmann <[email protected]> | |
Diffstat: | |
M lawn-hark/lawn-hark.sh | 73 +++++++++++++++++------------… | |
1 file changed, 41 insertions(+), 32 deletions(-) | |
--- | |
diff --git a/lawn-hark/lawn-hark.sh b/lawn-hark/lawn-hark.sh | |
@@ -5,6 +5,7 @@ | |
errorthreshold=3 | |
timeout=15 | |
+maxworkers=8 | |
onionsocksproxy="127.0.0.1:9050" | |
function tcpdial() { | |
@@ -95,26 +96,14 @@ function checkraw() { | |
return 0 | |
} | |
-checktime="$(date +%s)" | |
-statedir="$1" | |
+program="$(readlink -f "$0")" | |
-if [ -z "${statedir}" ]; | |
+if [ "${LAWNHARK_WORKER}" = "1" ]; | |
then | |
- printf "You need to specify a state dir.\n" >&2 | |
- exit 1 | |
-fi | |
- | |
-mkdir -p "${statedir}" | |
-if [ ! -d "${statedir}" ]; | |
-then | |
- printf "%s is not a directory! Aborting.\n" "${statedir}" >&2 | |
- exit 1 | |
-fi | |
+ statedir="$1" | |
+ checktime="$2" | |
+ f="$3" | |
-shift | |
- | |
-for f; | |
-do | |
type="" | |
selector="" | |
host="" | |
@@ -145,12 +134,10 @@ do | |
|| [ -z "${host}" ] \ | |
|| [ -z "${port}" ]; | |
then | |
- printf "ERROR\t%s\tInvalid entry!\n" "${f}" >&2 | |
- continue | |
+ flock -x "${program}" printf "ERROR\t%s\tInvalid entry!\n" "${… | |
+ exit | |
fi | |
- #printf "DEBUG\t%s\tchecking\t%s\t%s\t%s\t%s\n" "${f}" "${type}" "${se… | |
- | |
case "${type}" in | |
cso ) | |
error="$(checkcso "${host}" "${port}")" | |
@@ -182,8 +169,8 @@ do | |
error="$(checkraw "${sshhost}" "${sshport}")" | |
;; | |
* ) | |
- printf "TODO\t%s\tCan't handle %s\n" "${f}" "$… | |
- continue | |
+ flock -x "${program}" printf "TODO\t%s\tCan't … | |
+ exit | |
;; | |
esac | |
else | |
@@ -215,20 +202,42 @@ do | |
if [ ${errorcount} -ge ${errorthreshold} ]; | |
then | |
- printf "ERROR\t%s\t%s\n" "${f}" "${error}" >&2 | |
+ flock -x "${program}" printf "ERROR\t%s\t%s\n" "${f}" "${error… | |
fi | |
printf "%s\t%s\n" "${checktime}" "${errorcount}" > "${statefile}" | |
-done | |
+else | |
+ checktime="$(date +%s)" | |
+ statedir="$1" | |
-# garbage collection | |
-find "${statedir}" -type f | while read -r f; | |
-do | |
- IFS=" " read -r lastcheck errorcount < "${f}" | |
+ if [ -z "${statedir}" ]; | |
+ then | |
+ printf "You need to specify a state dir.\n" >&2 | |
+ exit 1 | |
+ fi | |
- if [ ${lastcheck} -ne ${checktime} ]; | |
+ mkdir -p "${statedir}" | |
+ if [ ! -d "${statedir}" ]; | |
then | |
- rm -f "${f}" | |
+ printf "%s is not a directory! Aborting.\n" "${statedir}" >&2 | |
+ exit 1 | |
fi | |
-done | |
+ shift | |
+ | |
+ for f; | |
+ do | |
+ printf "%s\0" "${f}" | |
+ done | LAWNHARK_WORKER=1 xargs -r -0 -P "${maxworkers}" -L1 "${program… | |
+ | |
+ # garbage collection | |
+ find "${statedir}" -type f | while read -r f; | |
+ do | |
+ IFS=" " read -r lastcheck errorcount < "${f}" | |
+ | |
+ if [ ${lastcheck} -ne ${checktime} ]; | |
+ then | |
+ rm -f "${f}" | |
+ fi | |
+ done | |
+fi |