Использование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
Можно проверить на запись (именованный канал ), а при соответствующем программировании — существование экземпляра работающей программы.
Предположим, мы зарезервировали имя файла /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 никогда не сигнализируются.
Я всегда опасаюсь условий гонки с файлами блокировки, поэтому я использую файл с определенным именем и использую mv
, потому что он атомарный.
Как правило, процесс использует постоянное имя файла, например /tmp/locks/myProcess.lock
. Любой процесс, желающий получить блокировку, пытается изменить имя на /tmp/locks/myProcess.lock.myPID
(, используя mv(1)
для оболочки и rename(2)
для C ). Затем он может проверить, существует ли его личное имя. Если нет, он зацикливается/засыпает по мере необходимости.
С некоторой осторожностью процесс может добавить журнал к файлу блокировки :, когда он впервые пытался заблокировать, когда он преуспел, когда он освободился.
Очевидно, что он должен помнить время первой попытки, так как он может зарегистрировать это только после успеха. Он также может следить за чрезмерными задержками и выдавать предупреждение для расследования (, предположительно, в другой копии процесса произошел сбой, и у него не было onExit для снятия блокировки ).
Вот пример с 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