2015-04-30 5 views
0

Я пытаюсь запустить сценарий, если он еще не запущен с использованием другого скрипта.Запустите сценарий, если он еще не запущен - получение [0: не найдено

test $ ls 
arcane_script.py calling_script.sh 

Это то, что мой сценарий выглядит прямо сейчас

test $ cat calling_script.sh 
#!/bin/bash 

PROCESSES_RUNNING=$(ps -ef | grep "arcane_script.py" | grep -v "grep" | wc -l) 
echo $PROCESSES_RUNNING 
if [$PROCESSES_RUNNING = "0"]; then 
    /usr/bin/python arcane_script.py 
fi; 

Я пробовал другие варианты в пределах if блока, как [$PROCESSES_RUNNING -eq 0], но все они выдают одинаковое сообщение об ошибке

test $ ./calling_script.sh 
0 
./calling_script.sh: line 5: [0: command not found 
test $ sh calling_script.sh 
0 
calling_script.sh: 5: calling_script.sh: [0: not found 

Что я делаю неправильно и как я могу его решить? Я googled вокруг, но не мог найти большую помощь.

+1

Не знаю, помогает ли это, но все примеры ifs, которые я видел, имеют пробелы после фигурных скобок, например: if [condition] вместо: if [condition] –

+0

@BenjyKessler Spot on, сработало. Отправьте его как ответ с объяснением, и я его соглашусь :) –

ответ

2

В bash вам необходимо защитить кронштейны пробелами. Скобки - это всего лишь сокращение для команды test. И в командах bash должны быть разделены пробелы. См. this link для более подробной информации. Поэтому вам нужно написать if [ condition ] вместо if [condition].

2

Вам нужно пространство вокруг скобок:

[ $PROCESSES_RUNNING = "0" ] 

Причина в том, что [ на самом деле название команды и в оболочке все команды должны быть отделены от других слов пробелами.

1

Более твердым способом было бы использовать файл pid. Затем, если файл pid существует, вы знаете, что это запущенный процесс. Идея состоит в том, чтобы записать processID в файл (например, в/tmp) в начале программы и удалить его, когда он закончится. Другая программа может просто проверить, существует ли файл pid.

В начале файла питона добавить что-то вроде

#/usr/bin/env python 

import os 
import sys 

pid = str(os.getpid()) 
pidfile = "/tmp/arcane_script.pid" 

if os.path.isfile(pidfile): 
    print "%s already exists, exiting" % pidfile 
    sys.exit() 
else: 
    file(pidfile, 'w').write(pid) 

# Do some actual work here 


# 
os.unlink(pidfile) 

Таким образом, вы даже не нужен дополнительный запуск Баша скрипта. Если вы хотите проверить с помощью Баш в любом случае, просто искать ИДП:

cat /tmp/arcane_script.pid 2>/dev/null && echo "" || echo "Not running" 

Обратите внимание, что файл PID должен быть удален вручную, если ваш сценарий не закончится правильно.

ps. Посмотрите на Monit, если вы хотите автоматически проверить, существует ли PID. При необходимости он может перезапустить программу.

+0

Можете ли вы объяснить мне больше об этом? Кроме того, что такое синтаксис '$!'? –

+0

'$!' Возвращает processID запущенного скрипта. Однако, поскольку вы используете python, я отредактировал ответ. – FeedTheWeb

+0

Спасибо. Я не хотел делать это через файл, потому что если процесс выпадет, чтобы удалить файл по какой-либо причине, то следующие задачи не будут выполняться. Во всяком случае, +1 за ответ. –

Смежные вопросы