作業系統:centos 5.2
場景描述:
我們有一個WEB工程,客戶要求使用普通用戶(例如chb)運行,然後在頁面上有一個按鈕,點擊之後可以關機
實現方式:
1. JAVA代碼:
複製代碼代碼如下:
public static boolean shutDownForLinux() {
try {
Runtime.getRuntime().exec("sudo /sbin/poweroff");
} catch (IOException e) {
return false;
}
return true;
}
2. 修改/etc/sudoers,在末尾增加如下資訊:
chb ALL=NOPASSWD:/sbin/reboot,/sbin/poweroff
3.設定開機自動啟動tomcat,修改/etc/rc.d/rc.local,最後增加如下:
su chb -c "/opt/tomcat/bin/startup.sh"
問題描述:
每次開機自動啟動的java進程,頁面上的關機按鈕都無法實現關機功能,但是此時如果以chb帳號透過ssh登入該伺服器,手動殺掉tomcat進程,然後再重新啟動tomcat,頁面上的關機按鈕就有效了。各位知道這是為什麼嗎?是否和sudo載入順序有關?或是和chb用戶shell環境有關?
問題分析:
透過分析開機啟動的JAVA進程和手動啟動的JAVA進程,發現tty是不同的,接著再去google sudo和tty的關係,發現sudo預設是需要tty的,系統開機啟動,沒有tty,而我們透過ssh客戶端登入伺服器,殺掉tomcat,再重新啟動tomcat,這時候可以取得tty為pts,因此可以使用sudo指令
解決方法:
透過修改/etc/sudoers文件,將
Defaults requiretty
註解掉即可