Получить команду, использованную для запуска процесса - сценарий оболочки - PullRequest
0 голосов
/ 05 ноября 2019

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

Но проблема в том, что полученная мной команда отличается от исходной команды, которая используется для запуска. Исходная команда имеет кавычки, а полученная команда без кавычек. Так что это не начало.

Не знаю почему? Может ли кто-нибудь помочь мне решить эту проблему ...

Сценарий ниже:

processes=$(ps aux | grep $1 -i | grep -v grep | grep -v sh | awk '{print $2}')
cntr=0
for i in $processes; do 
        cmd=$(cat /proc/$i/cmdline | tr '\000' ' ')
        kill $i; 
        cmds[$cntr]=$cmd
        cntr=$cntr+1
done

#Restart the process
echo "Commands: " $cmds
for cmd in $cmds; do 
    echo "Starting..." $cmd
    eval "$cmd"
done

Исходная команда: "/apps/test/bin/" xxxxx

Моя команда: /apps/test/bin xxxxx

1 Ответ

1 голос
/ 05 ноября 2019

Приведенный выше код восстанавливает командную строку, объединяя аргументы с пробелами. Это приведет к повторному повторному анализу специальных символов (в основном пробел, но на него будут влиять подстановочные знаки, такие как '*').

В качестве альтернативы рассмотрите возможность использования конструкции "${array[@]}", что приведет к массивамиспользуется непосредственно в качестве аргумента, без повторного анализа. Он будет обрабатывать пробелы, заключать в кавычки и т. Д.

Используя bash, исходная командная строка для PID $ N может быть восстановлена ​​с помощью:

p=()
while IFS= read -d $'\0' p1 ; do
    p+=("$p1")
done < /proc/$N/cmdline
# Execute, in background sub process
kill ...
"${p[@]}" &

См. Также Чтение строк с нулевым разделителемчерез цикл Bash

...