原来我有这个脚本运行在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主机名。
理想情况下,为了节省pipe理开销,我只想将一个服务文件放到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文档:
要传递美元符号,请使用“$$”。 其值在扩展时未知的variables被视为空string。 请注意,第一个参数(即要执行的程序)可能不是一个variables。
根据我的经验,systemd不喜欢在ExecStart指令中使用复杂的命令。
尝试把你的脚本放入一个包装文件并从ExecStart运行。