使用CentOS 6并使用upstart将日志输出并将其守护进程化

太长不看

在Stack Exchange上找到了非常合适的答案。

description "prometheus blackbox exporter"

start on runlevel [2345]
stop on runlevel [016]

script
exec bash << EOT
    cd /usr/local/opt/blackbox_exporter
    exec > >(logger -t blackbox_exporter) 2>&1
    exec ./blackbox_exporter
EOT
end script

为什么

    • CentOS 6で最近系(forkとかしないでフロントエンドで上がり続けてログはstdoutに出す系)のやつを手軽にdaemon化したい

init scriptを書くのは正直辛い、し、ネットでも良さそうな感じのやつがもう全然見つからなくなってきている
systemdに慣れすぎて今更bashでプロセス管理をほぼ完全自前で書くのがしんどい
そもそも最近系はフロントエンドで上がり続ける系が多い

コンテナとかsystemdではむしろそれが普通なので普通な流れ

CentOS 6にはupstart入ってるじゃん! → バージョンが古すぎてstdoutをlog出来ない → Stack Exchangeで神回答を発見

提示

如果想更改执行用户,只需要将 “exec bash << EOT” 更改为 “su hoge << EOT” 即可快速适应。

 : (snip)

script
exec su nobody << EOT
    cd /usr/local/opt/snmp_exporter
    exec > >(logger -t snmp_exporter) 2>&1
    exec ./snmp_exporter
EOT
end script

如果你想要在 rsyslog 中分割文件,只需通过 logger -t 指定的值进行 $programname 匹配即可。或者你也可以通过 logger -p 指定 facility.severity 来使用。

if $programname == 'blackbox_exporter' then /var/log/blackbox_exporter.log
& ~

感受或意见

当我看到这个Stack Exchange的回答时,才第一次知道bash的>()的存在。很深奥。当要搜索时,最好记住它的正式名称”进程替换”。通过将其与exec和重定向结合使用,我们可以将当前shell的标准输出(和错误输出)替换为任意的命令。相反,<()经常被使用,例如经常执行类似的命令 diff -u <(httpd.conf | sed -e ‘s/hoge/fuga/g’) <(ssh fuga cat /etc/httpd.conf)。

只是,(<>)会为括号内的命令创建一个可写入的文件描述符。例如,当我们使用 openssl 生成密钥对时,我们不需要将其保存到文件中,而是可以将其输出到标准输出。哦,原来如此!

bash-3.2$ openssl req -new -newkey 2048 -nodes -keyout >(cat) -x509 -subj "/CN=Example Certificate" -days 825 -out >(cat)
Generating a 2048 bit RSA private key
..........................+++
..............................................................+++
writing new private key to '/dev/fd/63'
-----
-----BEGIN PRIVATE KEY-----
 : (snip)
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
 : (snip)
-----END CERTIFICATE-----
bannerAds