鍍金池/ 問答/云計算  PHP  Linux/ 在阿里云服務(wù)器上運行shell腳本,公司突然斷網(wǎng)了,對腳本運行有影響嗎?

在阿里云服務(wù)器上運行shell腳本,公司突然斷網(wǎng)了,對腳本運行有影響嗎?

導(dǎo)入大批量的數(shù)據(jù),在阿里云服務(wù)器上寫了一個shell腳本來執(zhí)行,本人MAC終端連接服務(wù)器,但是突然公司斷網(wǎng)了。我在終端看到shell腳本終止了,輸出了結(jié)束標(biāo)識符。但是本人不知道腳本再斷網(wǎng)之前就結(jié)束了還是斷網(wǎng)的時候結(jié)束的???而且,斷網(wǎng)對腳本運行有影響嗎?圖片描述

回答
編輯回答
兔寶寶

1、nohup xxx command & (注意日志的重定向)或者類似讓進程放到后臺跑的方法
2、screen 或者類似的虛擬terminal

2018年7月24日 15:39
編輯回答
憶往昔

TD;TR: 多年Linux服務(wù)器運維經(jīng)驗的老司機告訴你,會有影響,所以長時間運行并且不允許中斷的腳本你應(yīng)該放在screen/tmux這一類虛擬終端執(zhí)行,幫你hold住session不中斷。

但并不意味著ssh斷開你運行的腳本一定會崩潰,我們假定你的腳本通常都是單線程同步運行的命令行

#!/bin/bash -e
command1
command2
command3

那么在Linux上用ps -efx命令看你的進程樹大致是這個樣子的:

sshd
\_ -bash
    \_ bash -e /path/to/your_script.sh
        \_ command1

如果此時強行斷開ssh連接(比如你強行關(guān)閉終端窗口,或者網(wǎng)絡(luò)斷開),那么你的ssh通道會broken pipe,于是系統(tǒng)會收到SIGHUP信號,干掉你的sshd fork出來的bash進程。于是你的command1就變成孤兒進程了。這個套路是不是有點眼熟?沒錯就是殺死僵尸進程的方法,那么command1將會被init進程(pid為1的進程)托管。如果你的子進程開啟了NOSIGHUP,是不會被SIGHUP信號干掉的,直接變成init進程的子進程繼續(xù)運行。所以此時你再次登錄ssh會發(fā)現(xiàn)command1已經(jīng)變成了init的子進程,像這樣:

init
\_ command1
如果你的command1沒有開啟NO_SIGHUP,那么是不會看到這個情況的,bash被干掉,下面的command1也將被干掉,并且不會再執(zhí)行command2,command3

當(dāng)然session已經(jīng)丟失,你也無法看到command1的stdout和stderr了。這時候你發(fā)現(xiàn)由于bash已經(jīng)被干掉,所以在command1執(zhí)行完畢之后,command2;command3自然無法執(zhí)行了。這就可能會對你的邏輯造成比較嚴(yán)重的影響——你的腳本執(zhí)行步驟并未完成,并且如果你的腳本不是冪等,也將難以重試或繼續(xù)。

因此,對于長時間運行并且不允許中斷的腳本,你應(yīng)該使用screen/tmux托管。

另:不一定所有的進程都會默認(rèn)開啟忽略SIGHUP信號,因此大多數(shù)進程對于SIGHUP信號的響應(yīng)是直接退出
2018年6月21日 14:24
編輯回答
墨小白

很會中斷進程的,以前啟動tomcat就是這樣跪掉的。
后面使用nohup命令,返回到后臺進程去跑

2017年8月20日 02:01
編輯回答
尐懶貓

看你shell里面打出的這個“導(dǎo)入結(jié)束”是在哪里打出來的,如果中途結(jié)束也能輸出這個就不能保證了,但是只有腳本結(jié)束了才輸出這個,就已經(jīng)執(zhí)行完了。

2018年1月26日 04:40