Как я могу узнать, запущена ли уже программа под названием /root /dodo /dodo? Но мне нужно запустить сканирование непосредственно из программы, которая тестирует. Спасибо...

file /root/todo/todo

#!/bin/bash
if [ check run program /root/todo/todo ]
then
  exit
else
  #continued
fi

5 ответов5

1

Вы можете проверить процесс и посмотреть, есть ли имя, как вы указали:

$ ps aux | grep "/root/dodo/dodo"

если вам нужно сделать тест внутри скрипта bash,

ps aux | grep -v "grep" | grep -q "/root/dodo/dodo"
if [ $? -eq 0 ]; then
   # do stuff if it is running
else
   # do stuff if it is not running
fi
0

На самом деле вам может понадобиться просканировать все запущенные процессы bash и проверить, какой скрипт они запускают (по крайней мере, в моем bash это всегда дескриптор файла 255).

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

#!/bin/bash

declare -i running

cmd=$(readlink -f "${0}")

while true ; do
    running=0
    pids=( $(pidof bash) )

    for p in "${pids[@]}" ; do
        script=$(readlink -f /proc/${p}/fd/255 2>/dev/null)
        if [ "${script}" = "${cmd}" ] ; then
            running+=1
        fi
    done

    echo "running ${running} times.. this is $$.."
    sleep 1
done

Логика выхода не реализована .. она просто подсчитывает количество запущенных процессов в цикле .. 8) должно быть легко принять ..

Это вводит некоторые условия гонки (как может сделать каждое решение), поскольку, если вы получаете 2 запущенных экземпляра, они оба могут проверить и решить выйти, потому что они уже запущены. 8)

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

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

0

Если вы хотите узнать, запущена ли программа с именем /root /dodo /dodo или нет, используйте следующее:

ps eaf | grep /root/dodo/dodo
0

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

Тогда посмотрите на этот вопрос и подумайте об использовании lockfile(1)

0

Подходящим способом проверить, соответствует ли один или несколько запущенных процессов строке, является pgrep . Никогда не используйте ps | grep .

if pgrep bash >/dev/null; then 
   echo "found a bash process"
else 
   echo "didn't find a bash process"
fi

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .