Bash скрипт странного поведения pgrep - PullRequest
0 голосов
/ 17 января 2020

Я пытаюсь написать простой bash скрипт, который переключит imwheel между запущенным и не запущенным.

Следующий код находится в toggle-imwheel.sh

#!/bin/bash

if pgrep imwheel;
then
        # imwheel process found
        echo "Killing imwheel process"
        killall imwheel
else
        # imwheel process not found
        echo "Starting imwheel process"
        imwheel
fi

pgrep должен возвращать код выхода 0, если он что-то нашел, и код выхода 1, когда ничего не найдено. Однако, похоже, что pgrep находит процессы, которые не существуют. Вот вывод оболочки bash:

mrsiliconguy@swift3:~/.imwheel-scripts$ pgrep imwheel <---- notice that no process is running
mrsiliconguy@swift3:~/.imwheel-scripts$ ./toggle-imwheel.sh 
9952 <------ ??????
Killing imwheel process
imwheel: no process found
mrsiliconguy@swift3:~/.imwheel-scripts$ ./toggle-imwheel.sh 
9955
Killing imwheel process
imwheel: no process found

Ответы [ 3 ]

1 голос
/ 17 января 2020

Вы можете попробовать, если вы запустите bash toggle-imwheel, ваш скрипт тоже должен работать. Это связано с тем, что по умолчанию pgrep попытается сопоставить имя команды. Имя вашего скрипта с именем foo-imwheel.sh, когда вы запустите его с ./foo-imwheel, pgrep найдет ваш скрипт самостоятельно как соответствующий процесс.

Однако, если вы запустите его с bash foo-imwheel или sh foo-imwheel, команда будет sh or bash. pgrep не будет соответствовать самому сценарию.

Вы можете проверить с помощью pgrep -l, чтобы вывести команду в вывод.

1 голос
/ 17 января 2020

Вы можете изменить регулярное выражение для pgrep, чтобы точно соответствовать:

#!/bin/bash

if pgrep '^imwheel$';
then
        # imwheel process found
        echo "Killing imwheel process"
        killall imwheel
else
        # imwheel process not found
        echo "Starting imwheel process"
        imwheel
fi
0 голосов
/ 17 января 2020

По какой-то причине запуск сценария с sh работает правильно ... Не совсем понятно, почему.

mrsiliconguy@swift3:~/.imwheel-scripts$ pgrep imwheel
mrsiliconguy@swift3:~/.imwheel-scripts$ sh toggle-imwheel.sh 
Starting imwheel process
INFO: imwheel started (pid=10439)
mrsiliconguy@swift3:~/.imwheel-scripts$ pgrep imwheel 
10439
mrsiliconguy@swift3:~/.imwheel-scripts$ sh toggle-imwheel.sh 
10439
Killing imwheel process
mrsiliconguy@swift3:~/.imwheel-scripts$ pgrep imwheel
mrsiliconguy@swift3:~/.imwheel-scripts$ 
...