Грепление переменной

Я написал простой скрипт для запуска и остановки скрипта Python в качестве службы. Я должен быть откровенным в отношении версии Python, на которой я запущен, потому что это находится в окне CentOS 5 с установленным Python 2.4 и 2.6 (оба через yum).

Вот что я до сих пор:

#!/bin/sh # chkconfig: 123456 90 10 workdir=/usr/local/bin/Foo start() { cd $workdir /usr/bin/python26 $workdir/Bar.py & echo "FooBar started." } stop() { pid=`ps -ef | grep '[p]ython26 /usr/local/bin/Foo/Bar.py' | awk '{ print $2 }'` echo $pid kill $pid sleep 2 echo "FooBar stopped." } case "$1" in start) start ;; stop) stop ;; restart) stop start ;; *) echo "Usage: /etc/init.d/foobar {start|stop|restart}" exit 1 esac exit 0 

Две вещи, в которых мне нужна помощь:

1) Я хочу быть «умнее» относительно имени файла и управления именами каталогов и устанавливать некоторые переменные до тех пор, пока что-нибудь повторится позже в скрипте (например, workdir). Моя основная проблема – это команда grep, и я не понял, как обращаться с переменными внутри grep. Мне бы хотелось, чтобы вы предложили более эффективный способ сделать это.

2) Я хочу добавить поддержку статуса для этого сценария инициализации и попросить его проверить, работает ли Bar.py.

One Solution collect form web for “Грепление переменной”

Возможно, мне что-то не хватает, но я не понимаю, почему вы возились с grep в первую очередь. Вот что такое pgrep :

 #!/bin/sh # chkconfig: 123456 90 10 workdir=/usr/local/bin/Foo start() { cd $workdir /usr/bin/python26 $workdir/Bar.py & echo "FooBar started." } stop() { pid=`pgrep -f '/Bar.py$'` echo $pid kill $pid sleep 2 echo "FooBar stopped." } case "$1" in start) start ;; stop) stop ;; restart) stop start ;; *) echo "Usage: /etc/init.d/foobar {start|stop|restart}" exit 1 esac exit 0 

Команда pgrep предназначена для возврата PID процессов, чье имя соответствует указанному шаблону. Поскольку это скрипт python, фактический процесс – это что-то вроде:

 python /usr/local/bin/Bar.py 

Где имя процесса – python . Итак, нам нужно использовать флаг -f pgrep для полного имени:

  -f, --full The pattern is normally only matched against the process name. When -f is set, the full command line is used. 

Чтобы убедиться, что это не соответствует таким fooBar.py , как fooBar.py , шаблон является /Bar.py$ так что он соответствует только части после последнего / и в конце строки ( $ ).

Для справок в будущем вы никогда не должны использовать ps | grep ps | grep чтобы получить PID. Это всегда будет возвращать как минимум две строки: одну для текущего процесса и одну для запуска grep:

 $ ps -ef | grep 'Bar.py' terdon 27209 2006 19 17:05 pts/9 00:00:00 python /usr/local/bin/Bar.py terdon 27254 1377 0 17:05 pts/6 00:00:00 grep --color Bar.py 
  • Разрешения python && unix (gitlab)
  • запускать локальный скрипт Python удаленно в среде
  • Как вычислить процент столбца файла?
  • скрипт bash останавливается при открытии хрома
  • Задачи автоматизации для системных администраторов
  • Установите библиотеку python на версию python, отличную от стандартного
  • Может ли python извлекать таблицы org-mode из документов org?
  • Запуск сценария python с терминала без расширения .py
  • Компиляция Python 2.7.10 Ошибка
  • Как проверить и запустить скрипт, если он не запущен?
  • Пакет python3-pyds9 отсутствует в Jessie
  • Linux и Unix - лучшая ОС в мире.