java在linux系统下开机启动无法使用sudo命令的原因及解决办法

操作系统: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
注释掉即可

(0)

相关推荐

  • 学习javaweb如何配置Tomcat的热启动

    (1)我们初学者在学习javaweb的时候每次更改项目都需要重新部署项目,这样的二话太麻烦 (2)使用tomcat的热启动就可以解决这个问题: 在tomcat目录下:找到 conf ----context.xml 打开 填写圈中的 就好了! (3)如果你的tomcat是自己的myeclipse中自带的话 就需要在自己的项目中找到 是在自己的工作区间下: 这是我的工作区间 就是第一个 点进去 有一个 .me_tcat 看到了conf 其他的过程和上述一样!

  • java eclipse 启动参数

    在参考了一些资料之后,我总结了一些比较常用的启动时Command Arguments,如果有不正确的地方希望大家予以指出. -arch [processor architecture] 描述:指定所使用的处理器的类别 举例:eclipse -arch x86或eclipse -arch sparc -application [id] 描述:指定要运行的应用,id为扩展org.eclipse.core.applications扩展点的插件id加扩展id 举例:例如有个插件id为edu.sdu.ap

  • 启动tomcat时 错误: 代理抛出异常 : java.rmi.server.ExportException: Port already in use: 1099的解决办法

    一.问题描述 今天一来公司,在IntelliJ IDEA 中启动Tomcat服务器时就出现了如下图所示的错误: 错误: 代理抛出异常错误: java.rmi.server.ExportException: Port already in use: 1099; nested exception is: java.net.BindException: Address already in use: JVM_Bind 这里说的是1099端口被其它进程占用了. 二.解决办法 找出占用1099端口的进程,

  • 详解Java编程中线程同步以及定时启动线程的方法

    使用wait()与notify()实现线程间协作 1. wait()与notify()/notifyAll() 调用sleep()和yield()的时候锁并没有被释放,而调用wait()将释放锁.这样另一个任务(线程)可以获得当前对象的锁,从而进入它的synchronized方法中.可以通过notify()/notifyAll(),或者时间到期,从wait()中恢复执行. 只能在同步控制方法或同步块中调用wait().notify()和notifyAll().如果在非同步的方法里调用这些方法,在

  • 详解Java多线程编程中线程的启动、中断或终止操作

    线程启动: 1.start() 和 run()的区别说明 start() : 它的作用是启动一个新线程,新线程会执行相应的run()方法.start()不能被重复调用. run() : run()就和普通的成员方法一样,可以被重复调用.单独调用run()的话,会在当前线程中执行run(),而并不会启动新线程! 下面以代码来进行说明. class MyThread extends Thread{ public void run(){ ... } }; MyThread mythread = new

  • 解决eclipse启动时报错Failed to create the Java Virtural Machine.问题的方法

    最近在学习android的开发搭建环境时,在网上下载了一个最新的eclpse,在启动的时候报错:Failed to create the Java Virtural Machine. 翻译一下,其意思就是说打开eclipse的失败原因是创建java虚拟机失败! 一般在启动的时候,出错,基本上除了虚拟机出错,就是jdk配置出错. 问题截图: 看原来的配置文件eclipse.ini的内容: 看最后一行"-XX:MaxPermSize=512M"改为256即可. 在看看找不到jdk启动报错的

  • java如何实现项目启动时执行指定方法

    本文实例为大家分享了java项目启动时执行指定方法,供大家参考,具体内容如下 想到的就是监听步骤如下: 1.配置web.xml <listener> <listener-class>com.listener.InitListener</listener-class> </listener> 2.编写InitListener类 package com.listener; import java.io.File; import javax.servlet.Ser

  • 基于RxJava实现酷炫启动页

    前言 RxJava 在 GitHub 主页上的自我介绍是 "a library for composing asynchronous and event-based programs using observable sequences for the Java VM"(一个在 Java VM 上使用可观测的序列来组成异步的.基于事件的程序的库).这就是 RxJava ,概括得非常精准. 之前注意到coding APP启动页很是酷炫,今天我们使用RxJava和属性动画模仿实现其效果.

  • Java实现软件运行时启动信息窗口的方法

    本文实例形式详述了Java实现一个程序运行时的启动窗口效果,如常用的Microsoft Word. Borland JBuilder 等,这样的窗口称为信息窗口.使用信息窗口的好处是可以使用户在等待软件主界面出现前的一段时间中得知软件运行状态.本例将演示如何来实现信息窗口,当打开程序时,信息窗口先显示,并在窗口上倒计时,直到"waiting 0"时,关闭该窗口,显示程序的主窗口. 该功能的主要实现方法如下: 一般来说,大多数的信息窗口是没有标题栏的,因此信息窗口不能由继承JFrame

  • Android Studio启动报错Java 1.8 or later is required的解决方法

    错误描述 在公司电脑上运行Android Studio 2.2已经有一段时间了,但是自己的笔记本上还是用的Android Studio 1.5,今天晚上下了一个Android Studio 2.2压缩包,解压后启动Android Studio 2.2就报错了,错误如下所示: Unsupported Java Version : Cannot start under Java 1.7.0_04-b22 : Java 1.8 or later is required. 分析错误 查看当前电脑的Jav

随机推荐