До сих пор я использовал
pidof -o %PPID -x "my-tool"
Чтобы обнаружить pid запущенного экземпляра my-tool.
Это короткая версия файла my-tool, исполняемого скрипта bash
#!/bin/bash
if pidof -o %PPID -x "my-tool"; then
echo "Already running"
exit 1
fi
... if not running go on
Но теперь мне нужно разрешить один экземпляр на пользователя и несколько на машину , чтобы в один и тот же момент мы могли запустить даже 100 my-tool, но только 1 на пользователя.
Обратите внимание, что мне нужен тест для создания чего-то вроде синглтона. Если инструмент будет запущен и запущен другой экземпляр, он закроется сам.
Вкратце: мне нужно, чтобы bash-скрипт мог определить, работает ли сам по себе текущий пользователь, и в этом случае он должен завершиться.
Как ?
pidof
, есть лучшие инструменты лжиpgrep
Ответы:
Используйте
pgrep
вместо этого:Используемые параметры:
Если вы хотите использовать это в скрипте bash, который проверяет, запущен ли он, вы можете использовать его
$0
. Это распространяется на путь текущего скрипта (например/home/username/bin/foo.sh
), но нам нужно толькоfoo.sh
. Для того, чтобы получить , что мы можем удалить все до последнего ,/
используя в Bash манипуляции строки инструментов :${0##*/}
. Это означает, что мы можем сделать что-то вроде:Вы также можете рассмотреть возможность использования файлов блокировки для этого:
источник
touch /tmp/$USER.foo.lock
использовать PID процесса,echo $$ >/tmp/$USER.foo.lock
можно было бы включить логику, чтобы проверить, существует ли такой процесс на самом деле.$(< pidfile)
вместо$(cat pidfile)
.Вы можете использовать
pgrep
команду find, если процесс выполняется конкретным пользователем, а затем запустить процесс, если он еще не запущен пользователем:Переменная окружения
$USER
, будет расширена до текущего зарегистрированного пользователя, т.е. пользователя, выполняющего скрипт. Поскольку нас интересует только то,my-tool
работает ли или нет, достаточно просто использовать состояние выхода напрямую с помощьюif
construct.Используйте этот скрипт в качестве оболочки для запуска
my-tool
и заставьте пользователей использовать это только или переименуйте его какmy-tool
и переименуйте оригиналmy-tool
во что-то другое (и измените имя внутри скрипта тоже).источник
Попробуйте это с помощью этого фрагмента:
Важно не писать,
pgrep|tr
потому что это превратилось бы в одноименную оболочку.источник
Оберните команду, которую вы хотите запустить в стаде, чтобы гарантировать, что одновременно выполняется только одна копия. Используйте файл lock_file, хранящийся в дереве домашних каталогов пользователя, чтобы у каждого пользователя был свой файл блокировки. Например:
'command' может быть любой командой или скриптом bash.
man flock
приводит примеры использованияисточник
flock
команды