Ⅰ linux 遠程主機後台運行任務 掛起腳本
背景 :工作需要,需要遠程式控制制主機使其斷開Xshell後也能一直運行。
關鍵字 :& ,nohup,腳本掛起。
在應用Unix/Linux時,我們一般想讓某個程序在後台運行,於是我們將常會用 & 在程序結尾來讓程序自動運行。
鍵入Ctrl + C,發出SIGINT信號陵世,程序會繼續運行
方法一缺斗、輸入命令:jobs
方法二:輸入命令:ps
fg、bg、jobs、&、nohup、ctrl+z、ctrl+c 命令
加在一個命令的最後,可以把這個命令放到後台執行,如
可以將一個正在前台執行的命令放到後台,並且處於暫停狀態。
查看當前有多少在後台運行的命令
jobs -l選項可顯示所有任務的PID,jobs的狀態可以是running, stopped, Terminated。但是如果任務被終止了(kill),shell 從當前的shell環境已知的列表中刪除任務的進程標識。
將後台中的命令調至前台繼續運行。如果後台中有多個命令,可以用fg %jobnumber(是命令編號,不是進程號)將選中的命令調出。
將一個在後台暫停的命令,變成在後台繼續執行。如果後台中有多個命令,可以用bg %jobnumber將選中的命令調出。
法子1:通過jobs命令查看job號(假設為num),然後執行kill %num
法子2:通過ps命令查看job的進程號(PID,假設為pid),然後執行kill pid
前台進程的終止:Ctrl+c
如果讓程序始終在後台執行,即使關閉當前的終端也執行(之前的&做不到),這時候需伏汪磨要nohup。該命令可以在你退出帳戶/關閉終端之後繼續運行相應的進程。
關閉中斷後,在另一個終端jobs已經無法看到後台跑得程序了,此時利用ps(進程查看命令)
如上所示:
nohup 和 & 組合了後台運行程序。
可以輸出到 out.log保存程序輸出,也可以輸出到/dev/null 即空設備,不保存輸出。
上面三種方式無論在nohup.out 或test.out都看不到數據結果,這是因為python執行有緩存輸出
解決
新的介面接入查看程序
使用&後台運行程序:
結果會輸出到終端
使用Ctrl + C發送SIGINT信號, 程序免疫
關閉session發送SIGHUP信號, 程序關閉
使用nohup運行程序:
結果默認會輸出到nohup.out
使用Ctrl + C發送SIGINT信號, 程序關閉
關閉session發送SIGHUP信號, 程序免疫
平日線上經常使用nohup和&配合來啟動程序:
同時免疫SIGINT和SIGHUP信號
同時,還有一個最佳實踐:
不要將信息輸出到終端標准輸出,標准錯誤輸出,而要用日誌組件將信息記錄到日誌里
nohup和&究竟有啥區別
Ⅱ 每天三分鍾搞定linux shell腳本24 後台模式運行
當運行腳本的時候在最後加上符號 & ,則對應的腳本在 後台運行 。建立腳本為,
輸入 ./test.sh & 運行
運行後1.txt文件會不斷增加內容,但是腳本以後台運行不會在終端佔用。運行結果為:
輸入 jobs 可以看到這個後台進程:
這個時候如果輸入exit,不會提示有後台進程在運行,而且後台進程也會退出。因為終端會話退出的時候會給這個後台進程發送一個 SIGHUP信號 。如果想要終端退出之後,進程不退出,可以讓進程捕獲SIGHUP信號。當然還有另一個方法,使用 nohup 指令運行腳本,比如輸入:
當用 nohup 並使用後台模式運行之後,即使退出終端,進程也不會收到SIGHUP信號。並且nohup會自動把標准輸出和標准錯誤重定向到nohup.out的文件中。
一個 運行的進程或者暫停的進程 都是一個作業,使用 jobs 命令可以查看當前的作業狀態。輸入:
我當前的輸出為:
(上面的作業2是輸入 ctrl+z 後暫停的進程)
其中, + 號被當作是默認作業,每個作業的前面有自己的序號。如果後續操作不加序號,那麼就被當做是在操作默認作業。比如使用 fg 指令前台運行作業,就是把27652這個進程前台運行,如果輸入 fg 1 ,那麼就是操作作業 1 了。帶-號的表示下一個默認作業。
輸入 bg 1 把 1號作業 後台運行,輸入 fg 2 把 2號作業 前台運行。
Ⅲ 在Linux中如何讓腳本在後台運行
在執行腳本的最後加上&
或者將腳本寫到cron job中
Ⅳ linux開機自動執行命令和腳本 自動啟動 自啟 進程一直運行
原文及更新: https://neucrack.com/p/91
直接在/etc/rc.local(/etc/rc.d/rc.local)文件中添加即可
上面這腳本實際上在使用時出現了問題, /home/neucrack/software/ss/start_ss_local.sh 這個命令始終沒有被執行,原因是 /home/neucrack/software/ss/start_kcptun_client.sh 中的命令阻塞了進程,導致後面一句始終沒有執行,可以將他們分別放到後台執行就行了,如何在後台執行可以看文章最後一部分
也可以自己手動在rc*.d中建立軟連接
桌面系統搜索 啟動 ,打開啟動管理器 添加刪除即可
一般有以下幾種方法:
1)在輸入命令的最前面加上 nohup 命令
如 nohup your_command & 這樣命令在你退出後仍然會在後台執行
2) setsid 命令
setsid your_command 該命令的結果是使你所運行的命令的父進程為init,所以只有關機該進程才會停止
3) (your_command &)
就是用括弧將你的命令括起來,這樣做也是使命令的父進程為init
4) disown
當你在命令行下輸入 your_command & 後命令就在後台執行了,然後執行jobs命令,該命令會列出當前正在後台執行的命令。例如輸入命令「top&」
然後執行"jobs"
輸出結果是
[1] + Suspended (tty output) top
注意行開頭方括弧內的數字,該數字叫做jobspec,是給當前後台運行的job的編號。這是你只要在命令行下輸入"disown -h 1" 後台運行的top命令就不會受到hangup信號的影響了。
5)使用 screen 命令
在命令行下輸入screen命令就開啟了一個screen進程,它就好像是一個全新的命令運行環境,在該環境中你可以像在正常的terminal下那樣執行
命令,但是這個screen是不受其父進程的hangup信號的影響的,既然screen不受其父進程影響,當你意外掉線或者退出系統時,在screen
中仍在執行的命令仍然會繼續執行。關於screen命令的使用方法你可以再去查閱相關資料。
Ⅳ linux 如何後台運行
所謂後台,指的是當前shell的後台,當你退出shell的時候,它當然會停止。
話說你想運行什麼程序,運行後還要關閉終端。
要不你試試
ctrl+alt+f1運行程序,然後再alt+f7切換回來。
Ⅵ 如何編寫Linux Daemon後台程序
守護進程(Daemon)是運行在後台的一種特殊進程。它獨立於控制終端並且周期核瞎模性地執行某種任務或等待處理某些發生的事件。守護進程是一種很有用的進 程。Linux的大多數伺服器就是用守護進程實現的。比如,Internet伺服器inetd,Web伺服器httpd等。同時,守護進程完成許多系統任 務。比如,作業規劃進程crond,列印進程lpd等。 x0dx0a守護進程的編程本身並不復雜,復雜的是各種版本的Unix的實現機制不盡相同,造成不同Unix環境下守護進程的編程規則並不一致。這需要讀者注意,照搬 某些書上的規則(特別是BSD4.3和低版本的System V)到Linux會出現錯誤的。下面將全面介紹Linux下守護進程的編程要點並給出詳細實例。 x0dx0a一. 守護進程及其特性 x0dx0a守護進程最重要的特性是後台運行。在這一點上DOS下的常駐內存程序TSR與之相似。其次,守護進程必須與其運行前的環境隔離開來。這些環境包括未關閉的 文件描述符,控制終端,會話和進程組,工作目錄以及文件創建掩模等。這些環境通常是守護進程從執行它的父進程(特別是shell)中繼承下來的。最後,守 護進程的啟動方式有其特殊之處。它可以在Linux系統啟動時從啟動腳本/etc/rc.d中啟動,可以由作業規劃進程crond啟動,還可以由用戶終端 (通常是shell)執行。 x0dx0a總之,除開這些特殊性以外,守護進程與普通進程基本上沒有什麼區別。因此,編寫守護進程實際上是把一個普通進程按照上述的守護進程的特性改造成為守護進程。如果讀者對進程有比較深入的認識就更容易理解和編程了。 x0dx0a二. 守護進程的編程要點 x0dx0a前面講過,不同Unix環境下守護進程的編程規則並不一致。所幸的是守護進程的編程原則其實都一樣,區別在於具體的實現細節不同。這個原則就是要滿足守護 進程的特性。同時,Linux是基於Syetem V的SVR4並遵循Posix標准,實現起來與BSD4相比更方便。編程要點如下; x0dx0a1. 在後台運行。 x0dx0a為避免掛起控制終端將Daemon放入後台執行。方法是在進程中調用fork使父進程終止,讓Daemon在子進程中後台執行。改緩 x0dx0aif(pid=fork()) x0dx0aexit(0);//是父進程,結束父進程,子進程繼續 x0dx0a2. 脫離控制終端,登錄會話和進程組 x0dx0a有必要先介紹一下Linux中的進程與控制終端,登錄會話和進程組之間的關系:進程屬於一個進程組,進程組號(GID)就是進程組長的進程號(PID)。登錄會話可以包含多個進程組。這些進程組共享一個控制終端。這個控制終端通常是創建進程的登錄終端。 x0dx0a控制終端,登錄會話和進程組通常是從父進程繼承下來的。我們的目的就是要擺脫它們,使之不受它們的影響。方法是在第1點的基礎上,調用setsid()使進程成為會話組長: x0dx0asetsid(); x0dx0a說明:當進程是會話組長時setsid()調用失敗。但第一點已經保證進程不是會話組長。setsid()調用成功後,進程成為新的會話組長和新的進程組長,並與原來的登錄會話和進程組脫離。由於會話過程對控制終端的獨占性,進程同時與控制終端脫離。 x0dx0a3. 禁止進程重新打開控制終端 x0dx0a現在,進程已經成為無終端的會話組長。但它可以重新申請打開一個控制終端。可以通過使進程不再成為會話組長來禁止進程重新打開控制終端: x0dx0aif(pid=fork()) x0dx0aexit(0);//結束第一子進程,第二子進程繼續(第二子進程不再是會話組長) x0dx0a4. 關閉打開的文件描述符 x0dx0a進程從創建它的父進程那裡繼承了打開的文件描述符。如不關閉,將會浪費系統資源,造成進程所在的文件系統無法卸下以及引起無法預料的錯誤。按如下方法關神鄭閉它們: x0dx0afor(i=0;i 關閉打開的文件描述符close(i);> x0dx0afor(i=0;i< NOFILE;++i)x0dx0a5. 改變當前工作目錄 x0dx0a進程活動時,其工作目錄所在的文件系統不能卸下。一般需要將工作目錄改變到根目錄。對於需要轉儲核心,寫運行日誌的進程將工作目錄改變到特定目錄如/tmpchdir("/") x0dx0a6. 重設文件創建掩模 x0dx0a進程從創建它的父進程那裡繼承了文件創建掩模。它可能修改守護進程所創建的文件的存取位。為防止這一點,將文件創建掩模清除:umask(0); x0dx0a7. 處理SIGCHLD信號 x0dx0a處理SIGCHLD信號並不是必須的。但對於某些進程,特別是伺服器進程往往在請求到來時生成子進程處理請求。如果父進程不等待子進程結束,子進程將成為 僵屍進程(zombie)從而佔用系統資源。如果父進程等待子進程結束,將增加父進程的負擔,影響伺服器進程的並發性能。在Linux下可以簡單地將 SIGCHLD信號的操作設為SIG_IGN。 x0dx0asignal(SIGCHLD,SIG_IGN); x0dx0a這樣,內核在子進程結束時不會產生僵屍進程。這一點與BSD4不同,BSD4下必須顯式等待子進程結束才能釋放僵屍進程。 x0dx0a三. 守護進程實例 x0dx0a守護進程實例包括兩部分:主程序test.c和初始化程序init.c。主程序每隔一分鍾向/tmp目錄中的日誌test.log報告運行狀態。初始化程序中的init_daemon函數負責生成守護進程。讀者可以利用init_daemon函數生成自己的守護進程。 x0dx0a1. init.c清單 x0dx0a#include < unistd.h > x0dx0a#include < signal.h > x0dx0a#include < sys/param.h > x0dx0a#include < sys/types.h > x0dx0a#include < sys/stat.h > x0dx0avoid init_daemon(void) x0dx0a{ x0dx0aint pid; x0dx0aint i; x0dx0ax0dx0aif(pid=fork()) x0dx0aexit(0);//是父進程,結束父進程 x0dx0aelse if(pid< 0) x0dx0aexit(1);//fork失敗,退出 x0dx0a//是第一子進程,後台繼續執行 x0dx0ax0dx0asetsid();//第一子進程成為新的會話組長和進程組長 x0dx0a//並與控制終端分離 x0dx0aif(pid=fork()) x0dx0aexit(0);//是第一子進程,結束第一子進程 x0dx0aelse if(pid< 0) x0dx0aexit(1);//fork失敗,退出 x0dx0a//是第二子進程,繼續 x0dx0a//第二子進程不再是會話組長 x0dx0ax0dx0afor(i=0;i< NOFILE;++i)//關閉打開的文件描述符 x0dx0aclose(i); x0dx0achdir("/tmp");//改變工作目錄到/tmp x0dx0aumask(0);//重設文件創建掩模 x0dx0areturn; x0dx0a} x0dx0a2. test.c清單 x0dx0a#include < stdio.h > x0dx0a#include < time.h > x0dx0avoid init_daemon(void);//守護進程初始化函數 x0dx0amain() x0dx0a{ x0dx0aFILE *fp; x0dx0atime_t t; x0dx0ainit_daemon();//初始化為Daemon x0dx0awhile(1)//每隔一分鍾向test.log報告運行狀態 x0dx0a{ x0dx0asleep(60);//睡眠一分鍾 x0dx0aif((fp=fopen("test.log","a")) >=0) x0dx0a{ x0dx0at=time(0); x0dx0afprintf(fp,"I'm here at %sn",asctime(localtime(&t)) ); x0dx0afclose(fp); x0dx0a} x0dx0a} x0dx0a} x0dx0a以上程序在RedHat Linux6.0下編譯通過。步驟如下: x0dx0a編譯:gcc _g _o test init.c test.c x0dx0a執行:./test x0dx0a查看進程:ps _ef x0dx0a從輸出可以發現test守護進程的各種特性滿足上面的要求。
Ⅶ 如何在Windows下運行linux shell腳本
1、首先電腦中需要安裝的是git的應用程序,安裝完成之後,可以在開始菜單進行查看。
2、並需要配置好git的bin,配置環境變數,把bin的絕對路徑復制到環境變數中path。
3、配置git的環境變數之後,在任意文件進行創建一個為mkdir.sh,文件名可以是隨意的結尾需要為.sh。
4、然後在sh的文件中進行輸入#!/bin/shtoucha.txtsleep10echo"testtesttesttest">>a.txt
創建一個為txt文件後testtesttesttest寫入到txt文件中。
5、然後進行雙擊.sh的文件,會彈出git的命令窗口,根據代弊毀碼的執行的時間窗口顯示多久。
6、然後就會自動生成一個檔旦a.txt的文件。
7、並會在a.txt文件中寫入為「testtesttesttest」的一段文字,即代表運行linuxshell腳本成功。租蠢備
Ⅷ linux腳本後台運行失敗
bash 腳信粗指本.sh > /dev/null 2>&1 &
bash 腳本.sh > /tmp/log.txt 2>&1 &
把輸出重定向凳茄一滑配下,可以重定向到空,或日誌文件,如果退出後還要繼續運行,前面加nohup