Penguncian penasihat telah digunakan sejak lama dan dapat digunakan dalam skrip bash. Saya lebih suka flock
sederhana (dari util-linux[-ng]
) di atas lockfile
(dari procmail
). Dan selalu ingat tentang jebakan saat keluar (sigspec ==EXIT
atau 0
, menjebak sinyal tertentu tidak berguna) dalam skrip tersebut.
Pada tahun 2009 saya merilis boilerplate skrip yang dapat dikunci (awalnya tersedia di halaman wiki saya, saat ini tersedia sebagai Gist). Mengubahnya menjadi satu-instance-per-user itu sepele. Dengan menggunakannya, Anda juga dapat dengan mudah menulis skrip untuk skenario lain yang memerlukan beberapa penguncian atau sinkronisasi.
Ini boilerplate yang disebutkan untuk kenyamanan Anda.
#!/bin/bash
# SPDX-License-Identifier: MIT
## Copyright (C) 2009 Przemyslaw Pawelczyk <[email protected]>
##
## This script is licensed under the terms of the MIT license.
## https://opensource.org/licenses/MIT
#
# Lockable script boilerplate
### HEADER ###
LOCKFILE="/var/lock/`basename $0`"
LOCKFD=99
# PRIVATE
_lock() { flock -$1 $LOCKFD; }
_no_more_locking() { _lock u; _lock xn && rm -f $LOCKFILE; }
_prepare_locking() { eval "exec $LOCKFD>\"$LOCKFILE\""; trap _no_more_locking EXIT; }
# ON START
_prepare_locking
# PUBLIC
exlock_now() { _lock xn; } # obtain an exclusive lock immediately or fail
exlock() { _lock x; } # obtain an exclusive lock
shlock() { _lock s; } # obtain a shared lock
unlock() { _lock u; } # drop a lock
### BEGIN OF SCRIPT ###
# Simplest example is avoiding running multiple instances of script.
exlock_now || exit 1
# Remember! Lock file is removed when one of the scripts exits and it is
# the only script holding the lock or lock is not acquired at all.
Jika skripnya sama untuk semua pengguna, Anda dapat menggunakan lockfile
mendekati. Jika Anda mendapatkan kunci, lanjutkan atau tampilkan pesan dan keluar.
Sebagai contoh:
[Terminal #1] $ lockfile -r 0 /tmp/the.lock
[Terminal #1] $
[Terminal #2] $ lockfile -r 0 /tmp/the.lock
[Terminal #2] lockfile: Sorry, giving up on "/tmp/the.lock"
[Terminal #1] $ rm -f /tmp/the.lock
[Terminal #1] $
[Terminal #2] $ lockfile -r 0 /tmp/the.lock
[Terminal #2] $
Setelah /tmp/the.lock
telah diperoleh skrip Anda akan menjadi satu-satunya yang memiliki akses ke eksekusi. Setelah selesai, lepas saja kuncinya. Dalam bentuk skrip, ini mungkin terlihat seperti:
#!/bin/bash
lockfile -r 0 /tmp/the.lock || exit 1
# Do stuff here
rm -f /tmp/the.lock
Saya pikir flock
mungkin merupakan varian yang paling mudah (dan paling berkesan). Saya menggunakannya dalam tugas cron untuk menyandikan DVD dan CD secara otomatis
# try to run a command, but fail immediately if it's already running
flock -n /var/lock/myjob.lock my_bash_command
Gunakan -w
untuk batas waktu atau tinggalkan opsi untuk menunggu hingga kunci dilepaskan. Terakhir, halaman manual menampilkan contoh yang bagus untuk banyak perintah:
(
flock -n 9 || exit 1
# ... commands executed under lock ...
) 9>/var/lock/mylockfile