我需要对一堆 Debian (Wheezy) 系统进行一些维护,并且必须在运行级别 1 进行。但并非所有机器都有键盘和屏幕;有些甚至位于其他地方。所以我不能只是去那里输入 root 密码来触发该作业。
所以我的问题是如何告诉 Debian 在“输入 root 密码或 ^D”提示符之前运行命令?
我尝试制作一个仅在运行级别 1 上运行的 init 脚本,但它仍然在所有进程被终止之前被触发。
有没有办法做到这一点?
答案1
我找到了一种方法,但感觉很脏......:)
所以我将保持这个开放,看看是否有人有一个干净的方法。
我的解决方案是修改 inittab 以运行脚本而不是 sulogin 并从脚本内恢复旧的 inittab。
这是一个“剪切并粘贴到终端”的概念验证版本,我只是用它来压缩一些虚拟机硬盘。
但是:除非您知道它的作用,否则不要尝试这个!
mkdir -p /opt/single
cp -a /etc/inittab /opt/single/inittab
sed -i "s/\/sbin\/sulogin/\/opt\/single\/job.sh/" /etc/inittab
cat>/opt/single/job.sh<<EOF
#!/bin/bash
#restore inittab
mv -fv /opt/single/inittab /etc/inittab
#make sure no one runs this by accident
chmod -x /opt/single/job.sh
#do your thing...
mount -o remount,ro /dev/sda1
fsck.ext4 -vfp /dev/sda1
zerofree -v /dev/sda1
mount -o remount,rw /dev/sda1
#work done
reboot
EOF
chmod +x /opt/single/job.sh
telinit 1