Как убедиться, что только один экземпляр сценария оболочки busybox работает без блокировки (файла)?

В маршрутизаторе с довольно ограниченной оболочкой Busybox (версия 1.24.2) я хочу убедиться, что сценарий оболочки резервного копирования (rsync) выполняется только тогда, когда он еще не запущен.

Ответы для полноценной оболочки Bash, как в:

  1. Быстрый и грязный способ убедиться, что одновременно работает только один экземпляр сценария оболочки
  2. Сценарий оболочки: убедитесь, что сценарий не выполняется, если уже выполняется

несовместимы с поврежденной пепельной оболочкой Busybox.

Прошивка маршрутизатора предоставляет следующие команды busybox:

[, [[, addgroup, adduser, arp, arping, ash, awk, basename, bash, brctl, bunzip2, bzcat, bzip2, cat, chgrp, chmod, chown, chpasswd, chroot, clear, cp, crond, crontab, cut, date, dd, df,
dhcp6c, dirname, dmesg, dnsdomainname, dos2unix, du, echo, egrep, eject, env, ether-wake, expr, false, fdisk, fgrep, find, flock, free, fuser, grep, gunzip, gzip, head, hostname,
ifconfig, inetd, insmod, kill, killall, klogd, ln, logger, login, ls, lsmod, lsof, md5sum, mdev, microcom, mkdir, mknod, mkswap, modprobe, more, mount, mountpoint, mv, netstat, nice,
nslookup, ntpd, passwd, pgrep, pidof, ping, ping6, printf, ps, pwd, rm, rmdir, rmmod, route, sed, sendmail, seq, sh, sleep, sort, start-stop-daemon, stat, strings, swapoff, swapon,
switch_root, sync, sysctl, syslogd, tail, tar, tee, telnetd, test, time, top, touch, tr, traceroute, traceroute6, true, udhcpc, umount, uname, uniq, unix2dos, unlink, uptime, usleep,
vconfig, vi, watch, wc, wget, which, whoami, xargs, yes, zcat, zcip 

flock решение для самовызова возвращает exit 1 при первом вызове. Используемый тестовый скрипт:

#!/bin/sh
[ "${FLOCKER}" != "$0" ] && exec /usr/bin/env FLOCKER="$0" /usr/bin/flock "$0" "$0" "$@" || exit 1
echo "servus!"
/bin/sleep 30

Предложение ps из ответа на https://unix.stackexchange.com/questions/48505/how-to-make-sure-only-one-instance-of-a-bash-script-runs#answer-48511 многообещающе, но все еще не совместимо с уменьшенной оболочкой Busybox маршрутизатора. Busybox поставляется с командой ps, но только с опциями w, l и T.

Есть предложения, не ловит nano или другой редактор с открытым скриптом?


person Pro Backup    schedule 02.09.2018    source источник
comment
Я вижу flock в этом списке. Вы можете использовать это, чтобы убедиться, что только один экземпляр вашего сценария резервного копирования запускается одновременно. Один из ответов, которые вы связали, выглядит так, как будто он показывает, как это сделать.   -  person Shawn    schedule 03.09.2018
comment
@Shawn Я бы хотел, чтобы сработало решение для самовызова стаи из одного из ответов Unix SA.   -  person Pro Backup    schedule 03.09.2018


Ответы (1)


flock кажется необходимым, чтобы не создавать состояние гонки. Решение на основе flock, которое работает с busybox 1.24.2:

#!/bin/bash

scriptname=$(basename $0)
lock="/var/run/${scriptname}"

exec 200>$lock
flock -n 200 || { echo "Error: Another copy of $0 is running. Exiting" ; exit 1; } 

pid=$$
echo $pid 1>&200

## Sample code
sleep 60
echo "Hello world"

источник: https://linuxaria.com/howto/linux-shell-introduction-to-flock

person Pro Backup    schedule 02.09.2018
comment
У этого есть много возможностей для гоночных условий. - person Shawn; 03.09.2018