Obtendo PID de dependência no systemd?

Obtendo PID de dependência no systemd?

Gostaria de escrever um arquivo de unidade systemd que precise passar para o comando exec o PID de uma de suas dependências. No arquivo da unidade eu gostaria de ter:

ExecStart=bar -p <PID of foo.service>
Requires=foo.service
After=foo.service

Existe uma maneira de obter o PID de uma dependência necessária de maneira fácil? Não foi possível localizar nada no manual nem um exemplo em nenhum dos arquivos da unidade em um desktop Ubuntu.

O caso de uso é criar um arquivo de unidade simples que pode ser usado para anexar o daemon JProfiler a um serviço baseado em Java para fazer depuração de desempenho remota. O comando para anexar o criador de perfil precisa do PID da JVM.

Responder1

Deman systemctl:

-p,--property=

Ao mostrar propriedades da unidade/trabalho/gerente com omostrarcomando, limite a exibição às propriedades especificadas no argumento. O argumento deve ser uma lista separada por vírgulas de nomes de propriedades,como " MainPID". [...]

Então systemctl show -p MainPID fooserá exibido MainPID=<pid>(em vez de apenas o pid). Usando um parâmetro adicional --value(ou o parâmetro de combinação -P(maiúsculas) para valores recentes o suficientesistema) fornecerá apenas o valor:

--value

Ao imprimir propriedades com show, imprima apenas o valor e ignore o nome da propriedade e "=". Veja também a opção -P acima.

Adicionado na versão 230.

Então, se o serviçofoopode ser identificado pelo seu PID principal (ou seja: o processo alvo não é na verdade um subprocesso do pid principal), isso poderia ser usado:

/bin/sh -c 'pid=$(systemctl show --value -p MainPID foo); [ "$pid" -ne 0 ] && exec bar -p $pid || exit 1'

Se não estiver em seu próprio roteiro, pode-seuse o prefixo :antes da linha executável para evitar qualquer análise desistema:

Prefixo Efeito
... ...
":" Se o caminho do executável tiver o prefixo ":", a substituição da variável de ambiente (conforme descrito na seção "Linhas de comando" abaixo) não será aplicada.
... ...

mantendo-o assim igual no arquivo de serviço:

ExecStart=:/bin/sh -c 'pid=$(systemctl show --value -p MainPID foo); [ "$pid" -ne 0 ] && exec bar -p $pid || exit 1'

informação relacionada