我正在使用sh文件从jupyterhub_config.py文件中启动一些其他命令,它基本上为用户重新创建了一个pod。
据我所知,这个问题似乎就在我重构过的sh文件中。
echo "Executing the command: $@"
exec "$@" & tail -f /var/log/logShell/logInShell.log
echo "External user startup script finished"
所期望的行为将是$@"执行,然后logInShell.log中的日志显示在shell中。然而,尽管文件有几行,但日志从未在shell中显示。
根据我所读到的内容,运行exec
将替换子流程,这让我认为它也替换了shell,这就是为什么在当前shell中从未看到tail的结果。
pod运行后,我可以看到tail命令正在使用ps -A
运行。然而,这些日志根本就不会到达shell。有人知道在当前进程或shell中获取运行尾部的正确方法是什么吗?。
去掉exec
关键字。您可能还需要监视正在包装的主程序何时退出,并在出现这种情况时关闭tail
。
#!/bin/sh
# warning: this is not actually echoing the same thing as the command you're running
echo "Executing the command: $@"
# --follow=name --retry makes tail behave right even if the log is only created
# after tail's startup is complete; requires GNU extensions
"$@" & main_pid=$!
tail --follow=name --retry /var/log/logShell/logInShell.log & tail_pid=$!
wait "$main_pid"; main_rc=$?
echo "External user startup script finished"
kill "$tail_pid"
exit "$main_rc"
现在,关于为什么echo "Arguments are: $@"
是积极误导/比无用更糟糕:
考虑./yourscript "first word" "*" "last word"
——first word
和last word
周围的引号对于正确理解命令行至关重要;CCD_ 9周围的引号也是如此。
但是,echo "Arguments are: $@"
运行echo "Arguments are: first word" "*" "last word"
——它在输出Arguments are: first word * last word
上写入,完全破坏原始命令中引号所在位置的记录。
如果您的shell是bash、zsh或足够现代的ksh,这是一个非致命的问题:您可以使用:而不是echo "Arguments are: $@"
# bash only
printf -v args_str '%q ' "$@"
echo "Arguments are: $args_str"
或者,使用bash 5.0或更新版本:
echo "Arguments are: ${*@Q}
但是使用基线POSIX-sh,如果你想消除歧义,最好的办法可能是将每个参数打印在第二行:
echo "Arguments are:"
printf ' - %sn' "$@"