在Busybox(版本1.24.2)外壳相当有限的路由器中,我想确保备份(rsync)外壳脚本仅在尚未运行时执行。
完整的Bash外壳的答案如下:
与残破的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
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不兼容。 ps
命令附带有Busybox,但仅包含选项w
,l
和T
。
有没有建议,没有抓住nano
或其他打开此脚本的编辑器?
答案 0 :(得分:0)
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