GNU/Linux >> Belajar Linux >  >> Linux

Apa cara terbaik untuk memastikan hanya satu contoh skrip Bash yang berjalan?

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

Linux
  1. Cara Terbaik Mendeteksi (dari Skrip) Apakah Perangkat Lunak Sudah Diinstal?

  2. Apa cara terbaik untuk mengatur variabel lingkungan di .bashrc?

  3. Apa cara terbaik untuk mendapatkan info tentang drive yang saat ini tidak terpasang?

  1. Cara "Tepat" Untuk Menguji Jika Suatu Layanan Berjalan Dalam Skrip?

  2. Bagaimana Memastikan Hanya Satu Contoh Skrip Bash yang Berjalan?

  3. Apa cara terbaik untuk mengirim sinyal ke semua anggota grup proses?

  1. Cara apa pun untuk keluar dari skrip bash, tetapi tidak keluar dari terminal

  2. Apa cara terbaik untuk menangani kondisi kehabisan memori di Jawa?

  3. Apa perbedaan antara menjalankan skrip Bash vs sumbernya?