那麼接下來問題就來了。因為手機上敲命令不如在電腦上方便,因此我需要將我常用的需求寫成指令碼,然後這樣的話我就只需要在手機上直接呼叫這個指令碼就可以了,就不用寫那麼又臭又長的命令了。
這次的需求具體是這樣的:
我需要新建乙個screen;
我要在新建的screen中切換工作路徑;
在新的工作路徑下開始執行另乙個指令碼;
讓這個screen自動detach掉,讓那個指令碼自動執行。
經過了很多踩坑,最終在stackoverflow上得到的可行命令如下:
screen -d -m -s new sh -c "cd /root/ins_dl/ && bash start_005.sh"
這裡直接給出結論。
-d引數:將指定的screen作業離線(detach)。
-m引數:即使目前已在作業中的screen作業,仍強制建立新的screen作業。
當-d和-m引數一起使用時,表示建立乙個detach模式的虛擬終端。在其中執行的任何命令,都能達到nohup的效果,這在有多個命令需要在後台連續執行的時候比較方便。也可以簡寫成-dms。其中s指的是-s,也就是對新screen的命名命令引數。
示例:
screen -dms s1
比較疑惑的應該是後面那個sh -c吧。這裡解釋一下:
sh -c命令可以讓bash將乙個字串當作一條完整的命令來執行:
-c string if the -c option is present, then commands are read from
string. if there are arguments after the string, they are
assigned to the positional parameters, starting with $0.
-c 字串 如果-c選項存在,則從字串中讀取命令。
如果字串後面有引數,則將它們分配給位置引數,從$0開始。
因此最前面給出的**完美解決了我的需求。
可否使用命令生成式$()或``生成命令?
答:可以是可以。但這些方法會使得程式必須將命令執行完畢才會繼續執行其他命令。那如果我呼叫的shell指令碼是乙個死迴圈程式,那這樣的話這條命令就會無限地等待下去,等待其呼叫的shell指令碼執行結束。這在我的需求中是萬萬不可的。
可不可以先生成乙個新的screen,然後再去寫別的命令執行?(分多行寫)
答:不可以。這樣的話最終的效果是:先生成了乙個新的screen;然後在主介面(而非生成的screen介面)下執行了其他命令。因為按照命令的執行順序,系統只會認為下一條命令還是針對於主介面來說的,並不會進入到子screen介面。
可不可以將這裡screen預設的-s引數補上?
答:不可以。先解釋一下什麼是-s引數:
-s 指定建立新視窗時,所要執行的shell。
但是,當你新增上-s引數時,命令就會變成-s sh -c "command"
。screen對命令的處理按空格分隔,因此在screen看來,它所接收到的命令實際只是-s sh
,而它後面的-c "command"
就被screen當作無法識別的廢話指令所直接丟棄了,因此command根本就無法被執行。想了想,好像還真什麼好的辦法。只好預設引數了。
linux中強大的screen命令
今天發現了乙個 寶貝 就是linux的screen命令,對於遠端登入來說,不僅提供了類似於nohup的功能,而且提供了我非常喜歡的 多個桌面 的功能。平常開乙個putty遠端登入,經常需要在兩個程式之間來回切換,怎麼辦?ctrl z和fg bg?這些太麻煩了。其實我們可以借助screen命令來實現輕...
linux中強大的screen命令
今天發現了乙個 寶貝 就是linux的screen命令,對於遠端登入來說,不僅提供了類似於nohup的功能,而且提供了我非常喜歡的 多個桌面 的功能。平常開乙個putty遠端登入,經常需要在兩個程式之間來回切換,怎麼辦?ctrl z和fg bg?這些太麻煩了。其實我們可以借助screen命令來實現輕...
linux命令 screen的簡單使用
在遠端命令列下某些長時間的操作,一旦網路出現故障,後果可能會很嚴重,在這種情況下可以使用screen命令來解決。screen可以建立乙個session,在不小心斷開以後還可以繼續恢復session儲存的狀態 rh or centos yum install screen debian apt get...