最初我让这个脚本在 Ubuntu 上运行,基本上被扔进 rc.local
#!/bin/bash
IBSYSDIR="/home/matthewh/tmp"
hca_id=1
if [ -d ${IBSYSDIR} ]; then
for hca in ${IBSYSDIR}/*; do
if [ -e ${hca}/node_desc ]; then
echo -n "$(hostname -s) HCA-${hca_id}" >> ${hca}/node_desc
fi
hca_id=$((hca_id+1))
done
fi
现在我的基础架构是 CoreOS,我想恢复这个脚本来为所有节点设置 Infiniband 主机名。
理想情况下,为了节省管理开销,我只想将一个服务文件插入 cloud-init 并启动它。所以我想出了如下所示的 systemd 服务文件。在提出单文件奇迹时,我设法将命令缩短为原始文件脚本中的一行。
[ -d ${IBSYSDIR} ] && for hca in ${IBSYSDIR}/*; do [ -e ${hca}/node_desc ] && echo -n "$(hostname -s) HCA-${hca_id}" >> ${hca}/node_desc; done
但是,我似乎无法运行/bin/sh -c "[ -d ${IBSYSDIR} ] && for hca in ${IBSYSDIR}/*; do [ -e ${hca}/node_desc ] && echo -n "$(hostname -s) HCA-${hca_id}" >> ${hca}/node_desc; done"
也许它没有将环境正确地拉入 sh. 如何让它在一个服务文件中工作(没有其他依赖脚本)?
服务文件和实际错误如下。
[Unit]
Description=Set the infiniband hostname
[Service]
Type=oneshot
Environment="IBSYSDIR=/sys/class/infiniband"
Environment="hca_id=1"
ExecStart=/bin/bash -c "[ -d ${IBSYSDIR} ] && for hca in ${IBSYSDIR}/*; do [ -e ${hca}/node_desc ] && echo -n "$(hostname -s) HCA-${hca_id}" >> ${hca}/node_desc; done"
[Install]
WantedBy=multi-user.target
我看到的实际错误:
Sep 10 00:30:21 service2-2 systemd[1]: Starting Set the infiniband hostname...
Sep 10 00:30:21 service2-2 sh[11134]: -s): -c: line 0: unexpected EOF while looking for matching `)'
Sep 10 00:30:21 service2-2 sh[11134]: -s): -c: line 1: syntax error: unexpected end of file
所以我走得更远了,但它仍然不起作用。
[Unit]
Description=Set the infiniband hostname
After=docker.service
Requires=docker.service
[Service]
Type=oneshot
ExecStart=/bin/bash -c 'IBSYSDIR=/sys/class/infiniband && hca_id=1 && [ -d ${IBSYSDIR} ] && for hca in ${IBSYSDIR}/*; do [ -e ${hca}/node_desc ] && echo -n "$(hostname -s) HCA-${hca_id}" >> "${hca}/node_desc"; done'
[Install]
WantedBy=multi-user.target
但是如果我直接运行
sudo /bin/bash -c 'IBSYSDIR=/sys/class/infiniband && hca_id=1 && [ -d ${IBSYSDIR} ] && for hca in ${IBSYSDIR}/*; do [ -e ${hca}/node_desc ] && echo -n "$(hostname -s) HCA-${hca_id}" >> "${hca}/node_desc"; done'
它确实有效。服务文件有什么特别之处?返回的错误代码是1。我认为这是一个权限被拒绝错误或什么的。
将所有更改
$
为$$
.从 systemd.unit 文档:
根据我的经验,systemd 不喜欢在其
ExecStart
指令中包含复杂的命令。尝试将您的脚本放入包装文件并从
ExecStart
.