![](/img/trans.png)
[英]“bash: fork: retry: No child processes ” when running docker quick start terminal or in /git bash shell
[英]Hide bash script's content when displaying currently-running processes in Mac Terminal
我有一些bash腳本,它將當前時間戳寫入某些文件:
#!/usr/bin/env bash
nohup & sh -c 'while [[ 1 ]];
do
vardate=$(date +%d\-%m\-%Y\_%H.%M.%S);
echo $vardate >> ~/test.txt;
sleep 1;
done' &
當我在所有進程的列表中運行ps -ef
,我可以看到:
...
501 32034 1 0 10:17PM ttys000 0:00.97 sh -c while [[ 1 ]];\012do\012 vardate=$(date +%d\-%m\-%Y\_%H.%M.%S);\012 echo $vardate >> ~/test.txt;\012 sleep 1;\012done
...
是否有可能完全隱藏此PID或至少隱藏腳本的內容?
ps
不顯示該腳本的內容本身 。 而是顯示正在運行的命令的命令行。 碰巧該命令是由您的腳本啟動的,因此出現在其中。
實際上,腳本本身很奇怪。 它已經是一個shell腳本,因此顯式啟動一個新的單獨的shell以在其中運行while
循環( sh -c
)的目的是什么? 與讓腳本直接執行循環相比,我沒有任何優勢。
例:
#!/usr/bin/env bash
while [[ 1 ]];
do
vardate=$(date +%d\-%m\-%Y\_%H.%M.%S);
echo $vardate >> ~/test.txt;
sleep 1;
done
或者,如果確實有目的的是不要在當前shell中執行循環,那么為什么不使用()
運算符在子shell中運行它呢?
范例 :
#!/usr/bin/env bash
(
while [[ 1 ]];
do
vardate=$(date +%d\-%m\-%Y\_%H.%M.%S);
echo $vardate >> ~/test.txt;
sleep 1;
done
)
兩者都可能會避免while
命令出現在ps
列表中。
問題仍然是,如果您使用sh -c
(或bash -c
)執行腳本文本,則該腳本文本是命令行的一部分,可以通過ps
顯示。 解決方案也相同:通過腳本的輸入而不是通過命令行選項將腳本輸入到shell。 您可以使用heredoc將其與nohup
和后台執行結合起來:
#!/usr/bin/env bash
nohup "$BASH" >> ~/test.txt 2>&1 <<'EOF' &
while [[ 1 ]]; do
date +%d\-%m\-%Y\_%H.%M.%S
sleep 1
done
EOF
這包括與原始版本相比超出必要范圍的更改。 這是一個摘要,大致按出現順序:
nohup
命令之后,您不需要或不需要&
。 我已經省略了。 sh
,而是通過自動變量$BASH
,該變量擴展為啟動當前bash實例的文件名。 bash
)的全部輸出及其stderr都重定向到輸出文件( >> ~/test.txt 2>&1
)。 這樣可以抑制原本為我顯示的診斷,並且比原始文件每秒每秒打開和關閉輸出文件更有效。 nohup
)是從heredoc重定向的,無需當前shell擴展( <<'EOF'
... EOF
)。 這是防止腳本內容出現在進程列表中的關鍵組件。 可能值得注意的是,heredoc內容直到下一行才真正開始,因此它不包含&
。 這很重要,因為&
終止命令(實際上是命令所屬的整個管道),因此它不能更早出現。 vardate
變量和echo
命令,而只允許直接輸出date
輸出。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.