我试图在CentOS 7映像中自动填充/ etc / issue(这将是一个模板,并且一眼就能很容易地识别出结果的虚拟机)。
我在/ sbin / ifup-local中有以下内容:
#!/斌/庆典
cd / etc;
取消链接./issue;
睡觉1;
issue_original =“$(cat ./issue-original)”;
show_ip =“$(ip addr show | awk'$ 1 ==”inet“&& $ 2!〜/ ^ 127 / {print”\ t“$ 2}')”;
合伙人/组织
echo -e“$ {issue_original} \ n \ n \ t当前IP号码:\ n \ t =================== \ n $ {show_ip} \ n”> 。/问题 ;
ci -m -u ./issue;
/ etc / issue-original看起来像:
login到:
节点:\\ n
运行:\\ S
当我手工运行脚本( sudo / sbin / ifup-local; cat / etc / issue )时,它会正确地填充/ etc / issue。 当这是自动运行的(例如,当它是sudo服务networking重新启动的结果;猫/ etc /问题 ),文件模板和静态文本在那里,但IP号码是空的(甚至不是空行)。
我误解了执行的顺序(是否在本地执行IP号码分配之前)? 它看起来像是在/ etc / sysconfig / network-scripts / ifup-post的末尾,所以我会假设它是在DHCP客户端设置接口之后。
在设置接口IP号码和“ip”命令知道它们之间有没有延迟? “睡眠”声明在那里,因为我认为可能是这样的。
任何正确的方向指针非常赞赏。
快乐星期天!
==========================
编辑:
这是我在重新启动networking服务后在/ etc / issue中看到的。
[david @ localhost〜] $ sudo服务networking重启
重新启动networking(通过systemctl):[OK]
[david @ localhost〜] $ cat / etc / issue
login到:
节点:\ n
运行:\ S
当前的IP号码:
===================
[david @ localhost〜] $
另外,我还用大量的debugging信息来检测脚本,find事情发生的地方,并且不能正常工作。 这是最后一次运行时logging的内容(我在运行前截断了日志,删除了无关的信息)。
[david @ localhost conf.d] $ clear
[david @ localhost conf.d] $> /tmp/ifup-local.log
[david @ localhost conf.d] $ tail -f /tmp/ifup-local.log
--------------------------------------------------
2014-10-01 18:50:0808 DEBUG:PATH:/ usr / sbin /:/ usr / bin /:/ sbin:/ usr / sbin:/ bin:/ usr / bin
2014-10-01 18:50:0808 DEBUG:PWD:/ etc
2014-10-01 18:50:0808 DEBUG:存在问题文件
2014-10-01 18:50:0808 DEBUG:删除旧的问题文件
2014-10-01 18:50:0808 DEBUG:issue_original:
login到:节点:\ n运行:\ S
2014-10-01 18:50:0808 DEBUG:即将检查IP号码
2014-10-01 18:50:0808 DEBUG:0
2014-10-01 18:50:0909 DEBUG:show_ip:
2014-10-01 18:50:0909 DEBUG:检出问题文件来locking它
2014-10-01 18:50:0909 DEBUG:new_issue:
login到:节点:\ n运行:\ S
当前的IP号码:
===================
2014-10-01 18:50:0909 DEBUG:存在问题文件
2014-10-01 18:50:0909 DEBUG:在问题文件中检查
--------------------------------------------------
2014-10-01 18:50:0909debugging:path:/ usr / sbin /:/ usr / bin /:/ sbin:/ usr / sbin:/ bin:/ usr / bin
2014-10-01 18:50:0909 DEBUG:PWD:/ etc
2014-10-01 18:50:0909 DEBUG:存在问题文件
2014-10-01 18:50:0909 DEBUG:删除旧的问题文件
2014-10-01 18:50:0909 DEBUG:issue_original:
login到:节点:\ n运行:\ S
2014-10-01 18:50:0909 DEBUG:即将检查IP号码
2014-10-01 18:50:0909 DEBUG:0
2014-10-01 18:50:0909 DEBUG:show_ip:
2014-10-01 18:50:0909 DEBUG:检出问题文件来locking它
2014-10-01 18:50:0909 DEBUG:new_issue:
login到:节点:\ n运行:\ S
当前的IP号码:
===================
2014-10-01 18:50:0909 DEBUG:存在问题文件
2014-10-01 18:50:0909 DEBUG:在问题文件中检查
这里是修改后的脚本,包含所有的debugging信息:
#!/斌/庆典
函数write-debug(){
msg =“$(date +'%Y-%m-%d%H:%M:%S%S')\ tDEBUG:\ t $ 1 \ n”;
echo -e $ {msg} >> $ {LOGFILE};
}
################################################
################################################
设置-x;
export LOGFILE ='/ tmp / ifup-local.log';
export PATH =“/ usr / sbin /:/ usr / bin /:$ {PATH}”;
echo -e“\ n -------------------------------------------- ------ \ n“>> $ {LOGFILE};
写入debugging“path:$ {path}”;
cd / etc;
write-debug“PWD:$(pwd)”;
[[-a ./issue]] && write-debug“问题文件存在”|| 写入debugging“不存在的问题文件”;
写入debugging“删除旧的问题文件”;
[[-a ./issue]] && unlink ./issue || 写入debugging“没有问题的文件删除”;
issue_original =“$(cat ./issue-original)”;
write-debug“issue_original:\ n $ {issue_original}”;
写 - debugging“即将检查的IP号码”;
show_ip =“$(ip addr show | awk'$ 1 ==”inet“&& $ 2!〜/ ^ 127 / {print”\ t“$ 2}')”;
#show_ip =“$(ip addr show | fgrep'inet')”;
写debugging$? ;
write-debug“show_ip:\ n $ {show_ip}”;
写入debugging“检出问题文件来locking它”;
[[-a ./issue]] && write-debug“问题文件存在”|| “不存在问题文件”;
合伙人/组织
export new_issue =“$ {issue_original} \ n \ n \ t当前IP号码:\ n \ t =================== \ n $ {show_ip} \ n”;
write-debug“new_issue:\ n $ {new_issue}”;
echo -e“$ {new_issue}”> ./问题;
[[-a ./issue]] && write-debug“问题文件存在”|| “不存在问题文件”;
ci -m -u ./issue;
写入debugging“在问题文件中检查”;
如果您想在/etc/issue显示IP地址,那么您可以在问题文件中使用\4 。 从man agetty来看,
4 or 4{interface}插入指定networking接口的IPv4地址(例如:\ 4 {eth0})。 如果未指定interface参数,则select第一个完全configuration的(UP,非LOCALBACK,RUNNING)>接口。 如果未find任何已configuration的接口,请回退到机器主机名的IP地址。
6 or 6{interface}与\ 4相同,但对于IPv6。
这是从Ubuntu的agetty from util-linux 2.28.2 。
我认为这个问题是在路上。 ip命令在/ sbin目录下。
通常 – 这个目录不在root用户之外,所以在脚本中使用它可能会导致问题。
尝试使用/ sbin / ip而不是ip命令。
我find了答案:直到networking更改(从“sudo服务networking重新启动”或重新启动)完成之前,信息不可用于“ip”命令。 因为networking的改变导致“/ etc / sysconfig / network-scripts / ifup-post”在完成之前运行,在完成之前依次调用“/ sbin / ifup-local”来运行“ip “自动调用”/ sbin / ifup-local“内部调用永远不会有这些信息。 为了解决这个问题,我把脚本从“/ sbin / ifup-local”重命名为“/ sbin / update-issue”,并创build了一个新的“/ sbin / ifup-local”asynchronous调用“/ sbin / update-issue” 。 现在起作用了。
=====
“ / sbin / ifup-local ”:
#!/ bin / sh的 nohup(sleep 1; / sbin / update-issue)&
=====
“ / sbin / update-issue ”:
#!/斌/庆典
函数write-debug(){
msg =“$(date +'%Y-%m-%d%H:%M:%S%S')\ tDEBUG:\ t $ 1 \ n”;
echo -e $ {msg} >> $ {LOGFILE};
}
################################################
################################################
设置-x;
export LOGFILE ='/ tmp / ifup-local.log';
export PATH =“/ usr / sbin /:/ usr / bin /:$ {PATH}”;
echo -e“\ n -------------------------------------------- ------ \ n“>> $ {LOGFILE};
写入debugging“path:$ {path}”;
cd / etc;
write-debug“PWD:$(pwd)”;
[[-a ./issue]] && write-debug“问题文件存在”|| 写入debugging“不存在的问题文件”;
写入debugging“删除旧的问题文件”;
[[-a ./issue]] && unlink ./issue || 写入debugging“没有问题的文件删除”;
issue_original =“$(cat ./issue-original)”;
write-debug“issue_original:\ n $ {issue_original}”;
写 - debugging“即将检查的IP号码”;
show_ip =“$(ip addr show | awk'$ 1 ==”inet“&& $ 2!〜/ ^ 127 / {print”\ t“$ 2}')”;
#show_ip =“$(ip addr show | fgrep'inet')”;
写debugging$? ;
write-debug“show_ip:\ n $ {show_ip}”;
写入debugging“检出问题文件来locking它”;
[[-a ./issue]] && write-debug“问题文件存在”|| “不存在问题文件”;
合伙人/组织
export new_issue =“$ {issue_original} \ n \ n \ t当前IP号码:\ n \ t =================== \ n $ {show_ip} \ n”;
write-debug“new_issue:\ n $ {new_issue}”;
echo -e“$ {new_issue}”> ./问题;
[[-a ./issue]] && write-debug“问题文件存在”|| “不存在问题文件”;
ci -m -u ./issue;
写入debugging“在问题文件中检查”;