Как запустить ровно 1 экземпляр программы. Или как протестировать конкретную запущенную программу

Использованиеsmemдля отображения общего объема всей пользовательской памяти, без подкачки и без двойного подсчета общей памяти:

sudo smem -c pss -t | tail -1

Вывод в моей системе:

4119846

Разворачивание этого:

  • -c pssвыбирает столбец, в данном случае PSS . Изman smem:

          smem reports physical memory usage, taking shared memory  pages
          into  account.   Unshared memory is reported as the USS (Unique
          Set Size).  Shared memory is divided evenly among the processes
          sharing   that  memory.   The  unshared  memory  (USS)  plus  a
          process's proportion of shared memory is reported  as  the  PSS
          (Proportional Set Size).  The USS and PSS only include physical
          memory usage.  They do not include memory that has been swapped
          out to disk.
    
    • -tпоказывает общий или сумму всех PSS, использованных в конце, а tail -1отсекает предыдущие данные.

Чтобы показать только общую неразделенную пользовательскую память, замените -c pssна-c uss:

sudo smem -c uss -t | tail -1

Выход:

 3874356 

Обратите внимание, что приведенное выше общее количество PSS более или менее совпадает с числом, показанным в строке #5, столбце #2 здесь:

smem -w

Выход:

Area                           Used      Cache   Noncache 
firmware/hardware                 0          0          0 
kernel image                      0          0          0 
kernel dynamic memory       1367712    1115708     252004 
userspace memory            4112112     419884    3692228 
free memory                  570060     570060          0 

0
01.03.2020, 11:33
3 ответа

Можно проверить на запись (именованный канал ), а при соответствующем программировании — существование экземпляра работающей программы.

Предположим, мы зарезервировали имя файла /tmp/fifo-myappв качестве имени файла FIFO (, оно должно быть настроено для каждого отдельного приложения; обычно он находится в папке определенного приложения -и указывается как абсолютный путь):

Файл1:test-wr-fifo

#!/bin/sh
# invocation: test-wr-fifo <timeout>

timeout="${1:=3}"

if ! [ -p "/tmp/fifo-myapp" ] ; then
    rm -f "/tmp/fifo-myapp"
    mkfifo "/tmp/fifo-myapp"
fi

{ sleep "$timeout" ; kill -s 0 $$ && kill -s TERM $$ ; } &
exec 3>"/tmp/fifo-myapp"

Эта программа завершит работу с неуспешным -статусом, если FIFO не открыт и истекло указанное время ожидания.

Файл2:single-inst-prog

#!/bin/sh

exec 3<"/tmp/fifo-myapp"

### Application Code ###

Это программа, для которой нам нужен только 1 экземпляр.

Для вызоваsingle-inst-prog:

./test-wr-fifo ||./single-inst-prog &

Этот метод работает, потому что открытие одного конца FIFO будет блокировать (, когда O _НЕБЛОКИРОВКА очищено ), пока другой конец также не будет открыт; этот метод также работает, потому что мы не читаем данные из FIFO и не записываем их в него, поэтому условие EOF и SIGPIPE никогда не сигнализируются.

0
28.04.2021, 23:21

Я всегда опасаюсь условий гонки с файлами блокировки, поэтому я использую файл с определенным именем и использую mv, потому что он атомарный.

Как правило, процесс использует постоянное имя файла, например /tmp/locks/myProcess.lock. Любой процесс, желающий получить блокировку, пытается изменить имя на /tmp/locks/myProcess.lock.myPID(, используя mv(1)для оболочки и rename(2)для C ). Затем он может проверить, существует ли его личное имя. Если нет, он зацикливается/засыпает по мере необходимости.

С некоторой осторожностью процесс может добавить журнал к файлу блокировки :, когда он впервые пытался заблокировать, когда он преуспел, когда он освободился.

Очевидно, что он должен помнить время первой попытки, так как он может зарегистрировать это только после успеха. Он также может следить за чрезмерными задержками и выдавать предупреждение для расследования (, предположительно, в другой копии процесса произошел сбой, и у него не было onExit для снятия блокировки ).

0
28.04.2021, 23:21

Вот пример с xmessage. Не уверен, что это нормально для вас, но вы можете попробовать.

#!/bin/sh
xmessage 'hello this is the first xmessage' &
last=$(ps -a | grep '[ ]xmessage$' | awk '{print $1}')
sleep 1
if test $(($(date +%s) % 2)) -eq 0
  then
    kill $last
fi
sleep 1
if ! ps -p $last >/dev/null
  then
    xmessage 'Hi, this is the second xmessage. Visible only if the first is close!' &
fi
0
28.04.2021, 23:21

Теги

Похожие вопросы