Проверка, если процесс, все еще работающий?

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

Option Explicit

Sub test()

    Dim Row As Long

    Row = 114

    Do Until Row = 121

        With ThisWorkbook.Worksheets("Sheet1")

            .Cells(Row, 2).Interior.Color = .Cells(Row, 7).Interior.Color

        End With

        Row = Row + 1

    Loop

End Sub
24
задан kenorb 4 July 2017 в 12:22
поделиться

6 ответов

Я бы использовал pgrep для этого (осторожно, непроверенный код):


exec("pgrep lighttpd", $pids);
if(empty($pids)) {

    // lighttpd is not running!
}

У меня есть сценарий bash, который делает что-то подобное (но с SSH туннели):


#!/bin/sh

MYSQL_TUNNEL="ssh -f -N -L 33060:127.0.0.1:3306 tunnel@db"
RSYNC_TUNNEL="ssh -f -N -L 8730:127.0.0.1:873 tunnel@db"

# MYSQL
if [ -z `pgrep -f -x "$MYSQL_TUNNEL"` ] 
then
    echo Creating tunnel for MySQL.
    $MYSQL_TUNNEL
fi

# RSYNC
if [ -z `pgrep -f -x "$RSYNC_TUNNEL"` ]
then
    echo Creating tunnel for rsync.
    $RSYNC_TUNNEL
fi


Вы можете изменить этот сценарий с помощью команд, которые вы хотите отслеживать.

21
ответ дан 28 November 2019 в 22:27
поделиться

Если вы делаете это в php, почему бы не использовать код php:

В работающей программе:

define('PIDFILE', '/var/run/myfile.pid');

file_put_contents(PIDFILE, posix_getpid());
function removePidFile() {
    unlink(PIDFILE);
}
register_shutdown_function('removePidFile');   

Затем, в программе сторожевого таймера, все, что вам нужно сделать is:

function isProcessRunning($pidFile = '/var/run/myfile.pid') {
    if (!file_exists($pidFile) || !is_file($pidFile)) return false;
    $pid = file_get_contents($pidFile);
    return posix_kill($pid, 0);
}

По существу, posix_kill имеет специальный сигнал 0, который фактически не отправляет сигнал процессу, но он проверяет, может ли сигнал быть отправлено (процесс на самом деле запущен).

И да, я использую это довольно часто, когда мне нужны длительные (или, по крайней мере, наблюдаемые) процессы php. Обычно я пишу сценарии инициализации для запуска программы PHP, а затем имею сторожевой таймер cron, чтобы ежечасно проверять, работает ли он (и если нет, то перезапустить его) ...

33
ответ дан ircmaxell 28 November 2019 в 22:27
поделиться

Попробуйте это

function processExists ($pid) {
    return file_exists("/proc/{$pid}");
}

Функция проверяет, существует ли файл процесса в корневом каталоге /proc/. Работает только для Linux

7
ответ дан Davіd 28 November 2019 в 22:27
поделиться

Я не видел здесь упомянутого, но вот еще один подход, позволяющий исключить второй grep из уравнения, я использую его со многими моими PHP-скриптами и должен работать универсально

exec("ps aux | grep -i '[l]ighttpd -D'", $pids);
if(empty($pids)) {
        print "Lighttpd not running!\n";
} else {
        print "Lighttpd OK\n";
}

Наслаждайтесь.

1
ответ дан Destreyf 28 November 2019 в 22:27
поделиться

У меня есть функция для получения pid процесса...

function getRunningPid($processName) {
    $pid = 0;
    $processes = array();
    $command = 'ps ax | grep '.$processName;
    exec($command, $processes);
    foreach ($processes as $processString) {
        $processArr = explode(' ', trim($processString));
            if (
            (intval($processArr[0]) != getmypid())&&
            (strpos($processString, 'grep '.$processName) === false)
        ) {
            $pid = intval($processArr[0]);
        }
    }
    return $pid;
}
0
ответ дан 28 November 2019 в 22:27
поделиться

Вы можете попробовать следующее, которое сочетает в себе кусочки этих двух подходов:

function processExists($processName) {
    $exists= false;
    exec("ps -A | grep -i $processName | grep -v grep", $pids);
    if (count($pids) > 0) {
        $exists = true;
    }
    return $exists;
}

Если это не сработает, вы можете просто попробовать запустить команду ps в вашей системе и посмотреть, что она выдаст.

9
ответ дан 28 November 2019 в 22:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: