LINUX.ORG.RU

Как запустить программу в скрипте с проверкой, запущена ли она уже?


1

1

Надо в скрипте сделать запуск резидентной программы. Но если программа уже запущена, запускать ее не нужно. Как сделать так, чтобы программа не запускалась если в памяти уже есть один экземпляр?

★★★★★

Ответ на: комментарий от strangeman

Если подробней - запускать программу с помощью скрипта, который сначала проверяет pgrep-ом, не запущена ли она уже, ну и дальше по плану.

strangeman ★★★★
()
Ответ на: комментарий от Nxx

Пять звёзд нафлудил, а на баше писать не научился? Тебе просто схему дали, а не готовую команду для копипасты.

imul ★★★★★
()
Ответ на: комментарий от AlexCones

Не проще создавать blah.lock в ~/.programname?

Не проще, но правильнее, поскольку позволит запускать по одному экземпляру каждому пользователю.

imul ★★★★★
()
Ответ на: комментарий от KivApple

Ставишь /usr/local/bin в PATH на первое место. Делаешь скрипт /usr/local/bin/kwrite, а внутри скрипта вызываешь нужную программу по абсолютному пути /usr/bin/kwrite. Пусть вызывают. Для существующих пользователей наужно будет править профиль шелла для новых нужно будет правильный PATH добавить в /etc/skel/*

imul ★★★★★
()
Ответ на: комментарий от KivApple

Хотя, конечно такой способ не убережёт от пользователя, который будет запускать программу по абсолютному пути.

imul ★★★★★
()

в /etc/init.d/ никогда не пробовал заглядывать?

anonymous
()

В пакете daemontools есть какая-то штука, специально для такого.

ValdikSS ★★★★★
()

например:

#!/bin/env bash

pidf = ${XDG_RUNTIME_DIR?~/.run/myprog} 
if test -f $pidf ; then
   cat "program is already run: $(cat $pidf)"
   exit -1
fi

run real program

про pgrep:

qwork qnikst # ./1.bash > /dev/null &
[1] 24572
qnikst@qwork ~ $ pgrep 1.bash
24572

фэйл.

qnikst ★★★★★
()
Ответ на: комментарий от Nxx

Странно. Из терминала работает, из скрипта ругается!!!!

Nxx ★★★★★
() автор топика
Ответ на: комментарий от zolden

pidof kwrite || kwrite

Спасибо. Вроде бы, так работает:

pidof kwrite > /dev/null || kwrite

Не понятно только, почему через if не хочет.

Nxx ★★★★★
() автор топика
Ответ на: комментарий от Nxx

run real program, заменить не exec smbds_other_program, не?

можно подобный враппер для любой программы написать изменив myprog на $1

т.е.

[code] test -f «${XDG_RUNTIME_DIR?~/.run/}$1» || (touch ${XDG_RUNTIME_DIR?~/.run/}$1 ; $1 ; rm ${XDG_RUNTIME_DIR?~/.run/}$1 ) [/code]

правда тут демонизирующиеся могут всё поломать. надо посложнее делать :)

qnikst ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.