На самом деле вам может понадобиться просканировать все запущенные процессы bash и проверить, какой скрипт они запускают (по крайней мере, в моем bash это всегда дескриптор файла 255).
следующее может быть немного хрупким с точки зрения переносимости и длительной доступности, но это может решить вашу проблему на данный момент.
#!/bin/bash
declare -i running
cmd=$(readlink -f "${0}")
while true ; do
running=0
pids=( $(pidof bash) )
for p in "${pids[@]}" ; do
script=$(readlink -f /proc/${p}/fd/255 2>/dev/null)
if [ "${script}" = "${cmd}" ] ; then
running+=1
fi
done
echo "running ${running} times.. this is $$.."
sleep 1
done
Логика выхода не реализована .. она просто подсчитывает количество запущенных процессов в цикле .. 8) должно быть легко принять ..
Это вводит некоторые условия гонки (как может сделать каждое решение), поскольку, если вы получаете 2 запущенных экземпляра, они оба могут проверить и решить выйти, потому что они уже запущены. 8)
ссылки для чтения необходимы для разрешения любых символических ссылок .. это может понадобиться, если скрипт запускается под другим именем (символическая ссылка с другим именем для себя)..
На самом деле, я бы решил эту проблему, заблокировав файл и / или создав файл pid.