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

Я написал простой скрипт для запуска и остановки скрипта 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 в файл немедленно
  • Установка плагина для quodlibet как патча
  • Пяям в дебюне 7
  • Как включить вывод скрипта в приглашение zsh
  • Запуск сценария Python при запуске
  • Создание deb и rpm из одного источника
  • Создание фиктивного трафика по ссылке OpenVPN
  • прослушивать событие кнопки питания в Python (без ACPI)
  • Все ли процессы Linux записывают EOF в stdout, когда они завершают / заканчивают завершение?
  • Python 2.7 на CentOS 5
  • Wireshark: удаленный захват по UART
  • Разрешение отклонено без подключения ssh
  • Interesting Posts

    Чрезвычайно громкая трещина и искаженный звук по S / PDIF с использованием ALSA

    Почему восклицательный знак `!` Иногда расстраивает bash?

    Что может означать DUP при использовании ping?

    Удалить дубликаты записей из файла CSV

    Шифровать загрузочную файловую систему

    Браузер в порядке, но не может направлять интернет через сервер теней

    Обнаружение трафика интерфейса с IP-адресом

    SIOCSIFNETMASK: неверный аргумент с использованием OpenVPN на Ubuntu

    Запуск команды после подключения моего клиента OpenVPN

    XServer: активные сеансы xserver в фоновом режиме

    firewalld принимает ответ на запрос многоадресной DNS из эфемерного порта

    Как заказывать файлы по дате в списке завершения вкладок

    Apache (httpd) не запускается при загрузке – CentOS 7

    Создание сценария оболочки, который анализирует и перенаправляет число в следующую команду?

    подключение ноутбука к ЖК-телевизору через кабель VGA

    Linux и Unix - лучшая ОС в мире.