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

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

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

回答
編輯回答
兔寶寶

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

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

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

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

#!/bin/bash -e
command1
command2
command3

那么在Linux上用ps -efx命令看你的進(jìn)程樹大致是這個(gè)樣子的:

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

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

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

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

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

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

很會(huì)中斷進(jìn)程的,以前啟動(dòng)tomcat就是這樣跪掉的。
后面使用nohup命令,返回到后臺(tái)進(jìn)程去跑

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

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

2018年1月26日 04:40