![](/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.