мне нужно сделать, это время от времени, и в конечном итоге взлома командной строки, пока она не работает.
Например, здесь я хочу увидеть, если у меня есть какие-либо SSH соединения, (8-й столбец, возвращаемый «пс» это работает «путь к PROCNAME» и фильтруется «AWK»:
ps | awk -e '{ print $8 }' | grep ssh | sed -e 's/.*\///g'
Тогда я положил его в раковине-скрипте («Eval» -ный командную строку внутри обратных кавычек), например:
#!/bin/bash
VNC_STRING=`ps | awk -e '{ print $8 }' | grep vnc | sed -e 's/.*\///g'`
if [ ! -z "$VNC_STRING" ]; then
echo "The VNC STRING is not empty, therefore your process is running."
fi
«СЭД» часть наличники пути к точному маркеру и может потребоваться для ваших нужд.
Вот мой пример, который я использовал для получения вашего ответа. Я написал его для автоматического создания 2 туннелей SSH и запуска VNC-клиента для каждого.
Я запустил его из своей оболочки Cygwin, чтобы выполнить администрирование на моем сервере с рабочей станции Windows, поэтому я могу перейти к UNIX/LINUX-земле с помощью одной команды (это также предполагает, что ключи клиента rsa уже были «ssh- copy-id "-ed и известны удаленному хосту).
Это идемпотент в том, что каждая команда proc/запускается только при их $ VAR eval в пустую строку.
Он добавляет «| wc -l», чтобы сохранить количество запущенных процессов, которые соответствуют (то есть количество найденных строк), вместо proc-name для каждого $ VAR в соответствии с моими потребностями. Я сохраняю инструкции «эхо», чтобы я мог повторно запустить и диагностировать состояние обоих соединений.
#!/bin/bash
SSH_COUNT=`eval ps | awk -e '{ print $8 }' | grep ssh | sed -e 's/.*\///g' | wc -l`
VNC_COUNT=`eval ps | awk -e '{ print $8 }' | grep vnc | sed -e 's/.*\///g' | wc -l`
if [ $SSH_COUNT = "2" ]; then
echo "There are already 2 SSH tunnels."
elif [ $SSH_COUNT = "1" ]; then
echo "There is only 1 SSH tunnel."
elif [ $SSH_COUNT = "0" ]; then
echo "connecting 2 SSH tunnels."
ssh -L 5901:localhost:5901 -f -l USER1 HOST1 sleep 10;
ssh -L 5904:localhost:5904 -f -l USER2 HOST2 sleep 10;
fi
if [ $VNC_COUNT = "2" ]; then
echo "There are already 2 VNC sessions."
elif [ $VNC_COUNT = "1" ]; then
echo "There is only 1 VNC session."
elif [ $VNC_COUNT = "0" ]; then
echo "launching 2 vnc sessions."
vncviewer.exe localhost:1 &
vncviewer.exe localhost:4 &
fi
Это очень жемчужно-как мне и, возможно, более, чем Unix Utils истинных сценарии оболочки. Я знаю, что есть много «MAGIC» чисел и cheezy жестко закодированных значений, но он работает (я думаю, что у меня тоже плохой вкус для использования слишком большого количества UPPERCASE). Гибкость может быть добавлена с некоторыми аргументами cmd-line, чтобы сделать это более универсальным, но я хотел поделиться тем, что сработало для меня. Пожалуйста, улучшайте и делитесь. Приветствия.
Лучший способ проверить, существует ли процесс: http: // stackoverflow.com/questions/3043978/how-to-check-if-a-process-id-pid-exists –
Не могли бы вы просто проверить, не получите ли вы пустой результат из команды grep вместо того, чтобы полагаться на возвращаемые значения? –
Я пробовал это и имею аналогичную проблему. Выход не учитывается. Вот код: #/бен/Баш SERVICE = $ 1 OUTPUT = $ (п.с. -a | Grep -v Grep | Grep $ 1) эхо $ OUTPUT , если [ "$ {# OUTPUT}" - gt; 0]; затем echo «' date': $ SERVICE работает, все в порядке » еще echo« 'date': $ SERVICE не работает» fi – elasticsecurity