Вы можете получить PID, а затем прочитать файл /prc/$pid/cmdline
, чтобы увидеть команду, используемую для его запуска.:
pid=123
com=$(perl -pe 's/\0/ /g' /proc/$pid/cmdline)
kill 123 && "$com"
Таким образом, вы можете превратить это в функцию:
restartPid(){
pid=$1
com=$(perl -pe 's/\0/ /g' /proc/"$pid"/cmdline)
kill 123 && "$com"
}
Однако это не будет работать в более сложных случаях, когда команда выполнялась в определенной среде. Вы можете начать создавать больше и расширить это, чтобы также включить среду с чем-то вроде этого:
restartPid(){
pid=$1
tempFile=$(mktemp)
perl -pe 's/\0/\n/g' /proc/"$pid"/environ |
perl -pe 's/^([^=]+)=(.*)/$1="$2"/' > "$tempFile"
read -r com args < <(perl -lne '@k=split(/\0/); print "$k[0] ", join " ", map "\"$_\"", @k[1..$#k]' /proc/"$pid"/cmdline)
dir=$(readlink -f "/proc/$pid/cwd")
kill $pid
(. \"$tempFile\"; cd "$dir"; eval $com $args )
}
Однако, как видите, это становится довольно сложным, и я не могу гарантировать, что это всегда будет работать. Хотя должно быть хорошее начало.
Захватите нужные данные с помощью регулярного выражения для шаблона ожидания:
send -- "command to generate CSR"
send -- "\r"
expect -re "(-+BEGIN CERTIFICATE REQUEST-+.+-+END CERTIFICATE REQUEST-+)"
Затем запишите только захваченный текст в файл, удалив каретку
set csr_text [regsub -all {\r\n} $expect_out(1,string) {\n}]
set fh [open $csr w]
puts $fh $csr_text
close $fh
Надеюсь, есть ответ только с expect
, но если нет, вы можете опубликовать -процесс с awk:
$ awk '
BEGIN {
beg = "-----BEGIN CERTIFICATE REQUEST-----"
end = "-----END CERTIFICATE REQUEST-----"
}
{ sub(/\r$/,"") }
sub(".*"beg,beg),sub(end".*",end)
' file
-----BEGIN CERTIFICATE REQUEST-----
MIICoDCCAYgCAQAwWzEfMB0GA1UEAxMWc3dpdGNoMS5ob21lLmdvc3NldC51azENM
AsGA1UECxMEaG9tZTEPMA0GA1UECh~~~~~~*SNIP*~~~~~~3lsRknVNg/ZAATDaRC
KR3EIZFS3izUZ/+3wYzni84QZcp6s6HmDaB2moRRarVThXnbcF0a5nvGQtU8j7jP
J/RPoWPRQa7vsfnEgN+gjQj6EYHeD/uMKzYPWeKEyQ4VPmw7K/VLySbMg==
-----END CERTIFICATE REQUEST-----
Я всегда советую не использовать выражения диапазона вместо флагов (см. https://stackoverflow.com/q/23934486/1745001), но, поскольку вы никогда не будете использовать это ни для чего другого, я понимаю, какого черта.