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