1. 程式人生 > >Java程式在Linux中實現後臺執行

Java程式在Linux中實現後臺執行

1、執行指令碼

程式的目錄結構如下

[[email protected] SocketDxpTaxi]# ls
config  lib  logs  run.sh  SocketDxpTaxi.jar
[[email protected] SocketDxpTaxi]# find
.
./run.sh
./lib
./lib/spring-data-commons-1.9.0.RELEASE.jar
./lib/aspectjrt-1.8.2.jar
......
./lib/mina-integration-beans-2.0.9.jar
./lib/jandex-1.1.0.Final.jar
./SocketDxpTaxi.jar
./logs ./logs/socket.log ./config ./config/applicationContext.xml ./config/jdbc.properties ./config/log4j.properties

其中SocketDxpTaxi.jar為我們要執行的jar,config是程式的配置檔案,lib是程式依賴的jar,logs存放日誌檔案,這幾個需要是同級。
eclipse中的程式結構如下
src
– |–com.tiamaes.*
– |–config
通過eclipse將程式匯出為jar,一般jar中是包含config的,這時需要把jar中的config資料夾刪除,要不然會衝突。

執行jar的指令碼如下,這個指令碼存在一點問題,Log4j稍微有點問題,但是對執行及日誌記錄沒有影響,日誌是通過將所有控制檯資料全部寫入檔案的形式記錄的

#!/bin/sh
#author:wangchengwei
#date:2015-7-7
#desc:Run java application

#Java的安裝目錄
JAVA_HOME=/usr/lib/java-1.7.0
#執行程式所使用的使用者
OWNER=root
#Java程式的目錄
APP_HOME=/software/TaxiData/SocketDxpTaxi
#Main方法的類
APP_MAINCLASS=com.tiamaes.gjds.socket.server.MinaServer
#日誌檔案
LOG_FILE=$APP_HOME/logs/socket.log #設定CLASSPATH CLASSPATH=$CLASSPATH:$APP_HOME/SocketDxpTaxi.jar #迴圈將lib資料夾下所有的jar新增到CLASSPATH for i in "$APP_HOME"/lib/*.jar; do CLASSPATH="$CLASSPATH":"$i" done #設定執行引數 JAVA_OPTS="-Xms512m -Xmx512m -Xmn256m -Djava.awt.headless=true -XX:MaxPermSize=128m" #echo $CLASSPATH; psid=0 #檢查Java程式是否執行 checkpid(){ javaps=`$JAVA_HOME/bin/jps -l | grep $APP_MAINCLASS` if [ -n "$javaps" ];then psid=`echo $javaps | awk '{print $1}'` else psid=0 fi } #執行程式 start(){ checkpid if [ $psid -ne 0 ];then echo "WARN:$APP_MAINCLASS already started!(pid=$psid)" else echo "Starting $APP_MAINCLASS..." JAVA_CMD="nohup $JAVA_HOME/bin/java $JAVA_OPTS -classpath $CLASSPATH $APP_MAINCLASS >> $LOG_FILE 2>&1 &" su - $OWNER -c "$JAVA_CMD" checkpid if [ $psid -ne 0 ];then echo "Started $APP_MAINCLASS (pid=$psid)[OK]" else echo "Started $APP_MAINCLASS [FAILED]" fi fi } #停止程式 stop(){ checkpid if [ $psid -ne 0 ];then echo "Stoping $APP_MAINCLASS...(pid=$psid)" su - $OWNER -c "kill $psid" checkpid if [ $psid -ne 0 ];then echo "Stoping use kill -9" su - $OWNER -c "kill -9 $psid" fi checkpid if [ $psid -eq 0 ];then echo "Stoped $APP_MAINCLASS [OK]" else echo "Stoped $APP_MAINCLASS [Failed]" stop fi else echo "WARN:$APP_MAINCLASS is not runing" fi } #檢視狀態 status(){ checkpid if [ $psid -ne 0 ];then echo "$APP_MAINCLASS is runing (pid=$psid)" else echo "$APP_MAINCLASS is not runing" fi } #幫助資訊 info() { echo "System Information:" echo "****************************" echo `head -n 1 /etc/issue` echo `uname -a` echo echo "JAVA_HOME=$JAVA_HOME" echo `$JAVA_HOME/bin/java -version` echo echo "APP_HOME=$APP_HOME" echo "APP_MAINCLASS=$APP_MAINCLASS" echo "****************************" } #$1表示接收第一個引數,如 ./run.sh start 。則$1就是start case "$1" in 'start') start ;; 'stop') stop ;; 'restart') stop start ;; 'info') info ;; 'status') status ;; *) echo "Usage: $0 {start|stop|restart|status|info}" exit 1 esac exit 0;

2、知識點解析

shell的基礎知識不在贅述,自己百度學習。重點說下幾個點。

2.1、執行jar
JAVA_OPTS="-Xms512m -Xmx512m -Xmn256m -Djava.awt.headless=true -XX:MaxPermSize=128m"
# java $JAVA_OPTS -classpath $CLASSPATH $APP_MAINCLASS

Java在執行jar是可以設定Java的執行引數、classpath等選項。

Java執行引數主要是記憶體的設定
-Xms:初始Heap大小,使用的最小記憶體,cpu效能高時此值應設的大一些
-Xmx:java heap最大值,使用的最大記憶體
-XX:PermSize:設定記憶體的永久儲存區域
-XX:MaxPermSize:設定最大記憶體的永久儲存區域
-Xmn:young generation的heap大小,一般設定為Xmx的3、4分之一

classpath用於設定jar執行是所依賴jar

2.2、Java中的jps命令

jps(Java Virtual Machine Process Status Tool)是JDK 1.5提供的一個顯示當前所有java程序pid的命令,簡單實用,非常適合在linux/unix平臺上簡單察看當前java程序的一些簡單情況。
比較常用的引數:
-q 只顯示pid,不顯示class名稱,jar檔名和傳遞給main 方法的引數
-m 輸出傳遞給main 方法的引數,在嵌入式jvm上可能是null
-m 輸出傳遞給main 方法的引數,在嵌入式jvm上可能是null
-l 輸出應用程式main class的完整package名 或者 應用程式的jar檔案完整路徑名
-v 輸出傳遞給JVM的引數
在本例中我們使用的是jps -l,使用 jps -l | grep $APP_MAINCLASS 可以根據Main方法所在的類名檢視程序中是否有我們的程式。然後通過awk得到程序的pid。

2.3、su命令的使用
su - $OWNER -c "$JAVA_CMD"

上面的命令表示使用 $OWNER使用者執行命令,-c後面跟命令。這樣做的好處就是執行的時候是帶有使用者的環境變數的,而且能保證我們的應用在我們指定的使用者下執行。

2.4、nohup

用途:不掛斷地執行命令,說的見簡單點就是讓程式能夠在後臺執行。
語法:nohup Command [ Arg … ] [ & ]

描述:nohup 命令執行由 Command 引數和任何相關的 Arg 引數指定的命令,忽略所有結束通話(SIGHUP)訊號。在登出後使用 nohup 命令執行後臺中的程式。要執行後臺中的 nohup 命令,新增 & ( 表示”and”的符號)到命令的尾部。

無論是否將 nohup 命令的輸出重定向到終端,輸出都將附加到當前目錄的 nohup.out 檔案中。如果當前目錄的 nohup.out 檔案不可寫,輸出重定向到 $HOME/nohup.out 檔案中。如果沒有檔案能建立或開啟以用於追加,那麼 Command 引數指定的命令不可呼叫。如果標準錯誤是一個終端,那麼把指定的命令寫給標準錯誤的所有輸出作為標準輸出重定向到相同的檔案描述符

意思就是讓我們的Java程式在後臺執行,並且將程式產生的日誌記錄到$LOG_FILE中,>表示寫入(先清除內容再寫入內容),>>表示追加

2>&1的含義

對於& 1 更準確的說應該是檔案描述符 1,而1 一般代表的就是STDOUT_FILENO,實際上這個操作就是一個dup2(2)呼叫.他標準輸出到all_result ,然後複製標準輸出到檔案描述符2(STDERR_FILENO),其後果就是檔案描述符1和2指向同一個檔案表項,也可以說錯誤的輸出被合併了.其中0 表示鍵盤輸入 1表示螢幕輸出 2表示錯誤輸出.把標準出錯重定向到標準輸出,然後扔到/DEV/NULL下面去。通俗的說,就是把所有標準輸出和標準出錯都扔到垃圾桶裡面。

2>&1 是將標準出錯重定向到標準輸出,這裡的標準輸出已經重定向到了 $LOG_FILE檔案,即將標準出錯也輸出到$LOG_FILE檔案中
有關詳細介紹可以檢視這篇博文:http://blog.csdn.net/annicybc/article/details/4814872

相關推薦

Java程式Linux實現後臺執行

1、執行指令碼 程式的目錄結構如下 [[email protected] SocketDxpTaxi]# ls config lib logs run.sh SocketDxpTaxi.jar [[email protected]

linux啟動 java -jar 後臺執行程式 linux啟動 java -jar 後臺執行程式

ps -ef | grep java  查詢java 端口占用   linux中啟動 java -jar 後臺執行程式   直接用java -jar xxx.jar,當退出或關閉shell時,程式就會停止掉。以下方法可讓jar執行後一直在後臺執行。

Linuxcrontab無法執行java程序的問題

java程序 問題 級別 路徑 jdk環境變量 系統 ron jdk環境變量配置 kill Linux中crontab無法執行java程序的問題 jdk環境變量配置問題;可以用全路徑來解決; 竟然是kill -9之後,後面的腳本都不運行,這個還沒有找到原因啊; 即便是系統級

程式在遠端主機後臺執行 (&、nohuo、 screen)Linux 使用技巧

作為一個系統運維人員,你是不是經常需要 SSH 或者 telent 遠端登入到 Linux 伺服器? 你是不是經常為一些長時間執行的任務而頭疼,比如系統備份、ftp 傳輸等等。通常情況下 我們都是為每一個這樣的任務開一個遠端終端視窗,因為他們執行的時間太長了。必須等待

Linuxcrontab自動執行程式相關命令與常見的錯誤

在Linux/Unix系統中可以使用crontab命令(crond服務)來實現特定時間自動執行指令碼。 首先簡單介紹下crontab命令的基本規則: * * * * * 具體命令 每分 每時 每日 每月 每週 執行具體命令 例如: 1、每週五下午兩點執行echo “Hell

Java併發程式設計的多執行緒是怎麼實現的?

眾所周知,在Java的知識體系中,併發程式設計是非常重要的一環,也是面試中必問的題,一個好的Java程式設計師是必須對併發程式設計這塊有所瞭解的。 併發必須知道的概念在深入學習併發程式設計之前,我們需要了解幾個基本的概念。同步和非同步同步和非同步用請求返回呼叫的方式來理解相對簡單。 同步:

windows 使用sc命令將程式註冊成服務 實現後臺執行開機自啟

sc命令可以註冊windows服務 實現程式後臺執行和開機自啟 sc可供選擇的引數有很多,這裡不詳細描述。只介紹簡單的最基本的sc使用方式。 假設已有程式名稱為lingyijiang.exe,被放在了C盤tmp資料夾下。 那麼我們此時可以開啟cmd視窗輸

Java實現執行緒的兩種方式之間的區別

 Java提供了執行緒類Thread來建立多執行緒的程式。其實,建立執行緒與建立普通的類的物件的操作是一樣的,而執行緒就是Thread類或其子類的例項物件。每個Thread物件描述了一個單獨的執行緒。要產生一個執行緒,有兩種方法:     ◆需要從Java.la

Linux C 守護程序實現後臺執行nohup效果

守護程序(Daemon)是執行在後臺的一種特殊程序。它獨立於控制終端並且週期性地執行某種任務或等待處理某些發生的事件。守護程序是一種很有用的進 程。Linux的大多數伺服器就是用守護程序實現的。比如,Internet伺服器inetd,Web伺服器httpd等。同時,守護

linux下nohup命令——讓程式在遠端主機後臺執行

  最近做的一個專案,需要登入到遠端主機進行執行除錯,採取的是talent遠端登入。進行了幾次實驗後發現當執行程式後關閉終端即關閉talent登入後程序有時候也會停止執行,這讓我很苦惱,本來想採取守護程序進行編寫程式,可是太麻煩,而且這樣時間上或許來不及了,所以上網查找了另

Android如何實現後臺執行定時任務

      Android中的定時任務一般有兩種實現方式,一種是使用Java API裡的Timer類,另一種是使用Android的Alarm機制。 這兩種方式在多數情況下都能實現類似的效果,但Timer有一個明顯的短板,它並不太適用與那些需要長期在後臺執行的定時任務。As

linux安裝wine執行windows程式

Wine的介紹  Wine是Wine Is Not an Emulator(Wine不是模擬器)的縮寫,其實是一個轉換層(或程式裝入器),能夠在Linux及與POSIX相容的其他類似作業系統上執行Windows應用程式。Wine在Linux上無法模擬Windows應用程式,而

java呼叫linux的shell指令碼並返回執行結果

來自:http://blog.sina.com.cn/s/blog_8e5354210101ku2e.html process這個類是一個抽象類,封裝了一個程序(你在呼叫linux的命令或者shell指令碼就是為了執行一個在linux下執行的程式,所以應該使用process

linux shell 實現後臺多程序執行的,開始和終止

linux shell 實現後臺開始,和停止多程序  知識點: xxxxcmd.sh  & //後臺執行程式 echo $!  // 列印上一次後臺執行程式的程序pid 實現: //start.sh  //開始10個程序 #!/bin/bash ./do10.s

程式在遠端主機後臺執行 (&、nohuo、 screen)Linux 使用技巧

作為一個系統運維人員,你是不是經常需要 SSH 或者 telent 遠端登入到 Linux 伺服器? 你是不是經常為一些長時間執行的任務而頭疼,比如系統備份、ftp 傳輸等等。通常情況下 我們都是為每一個這樣的任務開一個遠端終端視窗,因為他們執行的時間太長了。必須等待 它執

詳細分析 Java 實現執行緒的方法有幾種?(從本質上出發)

[TOC] # 詳細分析 Java 中實現多執行緒的方法有幾種?(從本質上出發) ## 正確的說法(從本質上出發) - **實現多執行緒的官方正確方法: 2 種。** - Oracle 官網的文件說明 ![在這裡插入圖片描述](https://img-blog.csdnimg

Linux實現一個簡單的進度條【轉】

做的 會有 發現 文件 rsquo 實時 時間 改進 常見 轉自:http://blog.csdn.net/yuehailin/article/details/53999288 說起進度條,其實大家常常見到,比如說你在下載視頻或文件的時候,提示你當前下載進度的就是我們今天

Linux計劃任務執行腳本crontab-簡潔版

error ESS CA lin 調度 pytho 可執行 too 用戶 我使用的是ubuntu16,所以在ubuntu中一切正常,在其他linux系統中應該都差不多。   1 計劃任務,crontab命令選項: -u指定一個用戶, -l列出某個用戶的任務

Linux實現DNS正反向解析

圖片 行編輯 正反向解析 name 反向 技術分享 aec roc 結束 實驗環境:RHEL6.5版本一臺。 ---------------------------------操作步驟---------------------------------------- 一、安裝

Linux 實現文件傳輸服務(二)

term 安裝程序 fig gin 分享圖片 域名解析 anon size upload 繼續上章vsftpd,介紹vsftpd的虛擬用戶配置 一、背景需求 當有多個用戶需要不同的權限時,本地用戶、匿名用戶都無法控制那麽精細,這時候可以考慮下虛擬用戶了,例如有如下要求。