
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
-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 foo
será 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'