java在linux系統(tǒng)下開機(jī)啟動無法使用sudo命令的原因及解決辦法
操作系統(tǒng):centos 5.2
場景描述:
我們有一個WEB工程,客戶要求使用普通用戶(例如chb)運(yùn)行,然后在頁面上有個按鈕,點(diǎn)擊之后可以關(guān)機(jī)
實(shí)現(xiàn)方式:
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.設(shè)置開機(jī)自動啟動tomcat,修改/etc/rc.d/rc.local,在末尾增加如下:
su chb -c "/opt/tomcat/bin/startup.sh"
問題描述:
每次開機(jī)自動啟動的java進(jìn)程,頁面上的關(guān)機(jī)按鈕都無法實(shí)現(xiàn)關(guān)機(jī)功能,但是此時如果以chb賬號通過ssh登錄該服務(wù)器,手動殺掉tomcat進(jìn)程,然后再重新啟動tomcat,頁面上的關(guān)機(jī)按鈕就有效了。各位知道這是為什么嗎?是否和sudo加載順序有關(guān)?或者和chb用戶shell環(huán)境有關(guān)?
問題分析:
通過分析開機(jī)啟動的JAVA進(jìn)程和手動啟動的JAVA進(jìn)程,發(fā)現(xiàn)tty是不同的,接著再去google sudo和tty的關(guān)系,發(fā)現(xiàn)sudo默認(rèn)是需要tty的,系統(tǒng)開機(jī)啟動,沒有tty,而我們通過ssh客戶端登錄服務(wù)器,殺掉tomcat,再重新啟動tomcat,這時候可以獲得tty為pts,因此可以使用sudo命令
解決方法:
通過修改/etc/sudoers文件,將
Defaults requiretty
注釋掉即可
相關(guān)文章
Mybatis中updateBatch實(shí)現(xiàn)批量更新
本文主要介紹了Mybatis中updateBatch實(shí)現(xiàn)批量更新,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03利用Java多線程技術(shù)導(dǎo)入數(shù)據(jù)到Elasticsearch的方法步驟
這篇文章主要介紹了利用Java多線程技術(shù)導(dǎo)入數(shù)據(jù)到Elasticsearch的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07ShardingSphere jdbc集成多數(shù)據(jù)源的實(shí)現(xiàn)步驟
本文主要介紹了ShardingSphere jdbc集成多數(shù)據(jù)源的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-10-10深入理解happens-before和as-if-serial語義
本文大部分整理自《Java并發(fā)編程的藝術(shù)》,溫故而知新,加深對基礎(chǔ)的理解程度。下面可以和小編來一起學(xué)習(xí)下2019-05-05