Do tej pory korzystałem
pidof -o %PPID -x "my-tool"
Aby wykryć pid ostatecznie działającej instancji mojego narzędzia.
To jest krótka wersja mojego narzędzia, wykonywalnego skryptu bash
#!/bin/bash
if pidof -o %PPID -x "my-tool"; then
echo "Already running"
exit 1
fi
... if not running go on
Ale teraz muszę zezwolić na jedną instancję na użytkownika i wiele na maszynę , abyśmy mogli uruchomić nawet 100 moich narzędzi w tym samym momencie, ale tylko 1 na użytkownika.
Zauważ, że potrzebuję testu, aby stworzyć coś w stylu singletona. Jeśli narzędzie zostanie uruchomione i uruchomiona zostanie inna instancja, zostanie ono zamknięte.
Krótko mówiąc: potrzebuję, aby skrypt bash mógł wykryć, czy sam już działa dla bieżącego użytkownika i w tym przypadku musi wyjść.
Jak ?
pidof
, są lepsze narzędzia do kłamstwapgrep
Odpowiedzi:
pgrep
Zamiast tego użyj :Dostępne opcje to:
Jeśli chcesz użyć tego w skrypcie bash, który sprawdza, czy jest już uruchomiony, możesz użyć
$0
. Rozszerza się to na ścieżkę bieżącego skryptu (np./home/username/bin/foo.sh
), Ale potrzebujemy tylkofoo.sh
. Aby dostać się, że możemy usunąć wszystko aż do ostatniego/
Przy użyciu bash za narzędzi manipulacji ciąg :${0##*/}
. Oznacza to, że możemy zrobić coś takiego:Możesz również rozważyć użycie do tego celu plików blokujących:
źródło
touch /tmp/$USER.foo.lock
używać PID procesu,echo $$ >/tmp/$USER.foo.lock
można by zastosować logikę, aby sprawdzić, czy taki proces faktycznie istnieje.$(< pidfile)
zamiast$(cat pidfile)
.Możesz użyć do
pgrep
sprawdzenia, czy proces jest wykonywany przez określonego użytkownika, a następnie uruchom proces, jeśli nie jest już uruchomiony przez użytkownika:Zmienna środowiskowa
$USER
, zostanie rozwinięta do aktualnie zalogowanego użytkownika, tj. Użytkownika uruchamiającego skrypt. Ponieważ interesuje nas tylko to, czymy-tool
jest uruchomiony, czy nie, wystarczy samo użycie statusu wyjścia bezpośrednio zif
konstruktem.Użyj tego skryptu jako opakowania do uruchomienia
my-tool
i spraw, aby użytkownicy używali go tylko lub zmień jego nazwę jakomy-tool
i zmień nazwę oryginałumy-tool
na coś innego (i zmień nazwę również w skrypcie).źródło
Wypróbuj za pomocą tego fragmentu:
Ważne jest, aby nie pisać,
pgrep|tr
ponieważ rozwinęłoby się to w powłokę o tej samej nazwie.źródło
Zawiń polecenie, które chcesz uruchomić, w stado, aby mieć pewność, że jednocześnie działa tylko jedna kopia. Użyj pliku blokady zapisanego w drzewie katalogu domowego użytkownika, aby każdy użytkownik miał własny plik blokady. Na przykład:
„polecenie” może być dowolnym poleceniem lub skryptem bash.
man flock
podaje przykłady użyciaźródło
flock
poleceń