telinit 1 并在那里运行命令

telinit 1 并在那里运行命令

我需要对一堆 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

相关内容