【问题标题】:How to ensure that only one instance of a busybox shell script is running at a time without lock(file)?如何确保一次只有一个busybox shell脚本实例在没有锁(文件)的情况下运行?
【发布时间】:2019-02-08 00:16:12
【问题描述】:

在带有相当有限的 Busybox(版本 1.24.2)shell 的路由器中,我想确保备份 (rsync) shell 脚本仅在它尚未运行时执行。

完整的 Bash shell 的答案如下:

  1. Quick-and-dirty way to ensure only one instance of a shell script is running at a time
  2. Shell script: Ensure that script isn't executed if already running

与残缺的 Busybox ash shell 不兼容。

路由器固件提供这些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 self-invocation solution 在第一次调用时确实返回 exit 1。使用的测试脚本:

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

https://unix.stackexchange.com/questions/48505/how-to-make-sure-only-one-instance-of-a-bash-script-runs#answer-48511 的答案中的ps 建议很有希望,但仍与减少路由器的 Busybox shell 不兼容。 Busybox 带有ps 命令,但只有wlT 选项。

有什么建议,没有找到 nano 或其他打开此脚本的编辑器?

【问题讨论】:

  • 我在该列表中看到了flock。您可以使用它来确保一次只运行一个备份脚本实例。您链接的答案之一似乎显示了如何。
  • @Shawn 我希望来自 Unix SA 答案之一的羊群自调用解决方案能够奏效。

标签: shell busybox ash


【解决方案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

【讨论】:

  • 这有很多竞争条件的机会。
猜你喜欢
  • 2011-09-22
  • 1970-01-01
  • 2010-09-16
  • 1970-01-01
  • 2012-01-08
  • 1970-01-01
  • 2011-04-27
  • 2017-10-01
  • 1970-01-01
相关资源
最近更新 更多