Как мне убедиться, что мой bash-скрипт еще не запущен?

== проверяет ссылки на объекты, .equals() проверяет строковые значения.

Иногда кажется, что == сравнивает значения, потому что Java делает некоторые закулисные вещи, чтобы убедиться, что одинаковые строки в строке являются одним и тем же объектом.

Для Например:

String fooString1 = new String("foo");
String fooString2 = new String("foo");

// Evaluates to false
fooString1 == fooString2;

// Evaluates to true
fooString1.equals(fooString2);

// Evaluates to true, because Java uses the same object
"bar" == "bar";

Но будьте осторожны с нулями!

== обрабатывает строки null в порядке, но вызов .equals() из пустой строки приведет к исключению:

String nullString1 = null;
String nullString2 = null;

// Evaluates to true
System.out.print(nullString1 == nullString2);

// Throws a NullPointerException
System.out.print(nullString1.equals(nullString2));

Итак, если вы знаете, что fooString1 может но не менее очевидно, что он проверяет значение null (из Java 7):

System.out.print(Objects.equals(fooString1, "bar"));
13
задан danb 17 September 2009 в 20:00
поделиться

7 ответов

# Use a lockfile containing the pid of the running process
# If script crashes and leaves lockfile around, it will have a different pid so
# will not prevent script running again.
# 
lf=/tmp/pidLockFile
# create empty lock file if none exists
cat /dev/null >> $lf
read lastPID < $lf
# if lastPID is not null and a process with that pid exists , exit
[ ! -z "$lastPID" -a -d /proc/$lastPID ] && exit
echo not running
# save my pid in the lock file
echo $$ > $lf
# sleep just to make testing easier
sleep 5

В этом скрипте есть по крайней мере одно условие гонки. Не используйте это для системы жизнеобеспечения, лол. Но для вашего примера это должно работать нормально, потому что ваша среда не запускает два сценария одновременно. Есть много способов использовать больше атомарных блокировок, но они, как правило, зависят от факультативно установленной конкретной вещи или работают иначе в NFS и т. Д.

20
ответ дан 1 December 2019 в 17:36
поделиться

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

NAME
       flock - Manage locks from shell scripts
SYNOPSIS
       flock [-sxon] [-w timeout] lockfile [-c] command...
9
ответ дан 1 December 2019 в 17:36
поделиться

Сохраните свой pid в mylockFile . Когда вам нужно проверить, найдите в ps процесс с идентификатором pid, который вы читаете из файла. Если он существует, ваш скрипт запущен.

4
ответ дан 1 December 2019 в 17:36
поделиться

Если вы хотите проверить существование процесса, просто посмотрите на вывод

ps aux | grep your_script_name

Если он там, значит, он не мертв ...

Как указано в комментариях и других ответах, использование PID, хранящегося в файле блокировки, намного безопаснее и является стандартным подходом, применяемым большинством приложений. Я делаю это просто потому, что это удобно, и я почти никогда не вижу крайних случаев (например, редактирование файла при выполнении cron ) на практике.

4
ответ дан 1 December 2019 в 17:36
поделиться

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

Вы можете использовать переменные среды, такие как $ USER, или вывод программы, такой как tty , для создания имя файла. Для cron вы можете установить переменную в файле crontab и проверить ее в своем скрипте.

1
ответ дан 1 December 2019 в 17:36
поделиться

Вы всегда можете просто:

 if ps -e -o cmd | grep scriptname > /dev/null; then 
     exit
 fi

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

0
ответ дан 1 December 2019 в 17:36
поделиться

Никогда не используйте файл блокировки , всегда используйте каталог блокировки . В вашем конкретном случае это не так важно, потому что запуск скрипта запланирован с интервалом в 5 минут. Но если вы когда-нибудь повторно используете этот код для cgi-скрипта веб-сервера, вы - тост.

if mkdir /tmp/my_lock_dir 2>/dev/null
then
   echo "running now the script"
   sleep 10
   rmdir /tmp/my_lock_dir
fi

Это проблема, если у вас устаревшая блокировка, что означает, что блокировка есть, но нет связанного процесса. Ваш cron никогда не запустится.

Зачем использовать каталог? Поскольку mkdir - это атомарная операция. Только один процесс может создать каталог, все остальные процессы получат ошибку. Это работает даже в общих файловых системах и, возможно, даже между разными типами ОС.

7
ответ дан 1 December 2019 в 17:36
поделиться
Другие вопросы по тегам:

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