Shell 在unix中对文件的并发访问

Shell 在unix中对文件的并发访问,shell,concurrency,ssh,Shell,Concurrency,Ssh,我有一个脚本可以在远程服务器上运行 df_command.sh:- #!/bin/bash if [[ $1 == "" ]]; then echo -e "No Argument passed:- Showing default disk usage\n" df -k > /tmp/Global_df_tmp 2>&1 cat /tmp/Global_df_tmp else df -k "$1" > /tmp/Global_df_tm

我有一个脚本可以在远程服务器上运行

df_command.sh:-

#!/bin/bash

if [[ $1 == "" ]]; then
    echo -e "No Argument passed:- Showing default disk usage\n"
    df -k > /tmp/Global_df_tmp 2>&1
    cat /tmp/Global_df_tmp
else
    df -k "$1" > /tmp/Global_df_tmp 2>&1
    cat /tmp/Global_df_tmp
fi
以下是我运行此脚本的方式:-

$ssh -oConnectTimeout=5 -oBatchMode=yes -l group servername 'bash -s -- /some/directory' < ./df_command.sh
这可以很好地工作,并在每个场景中为我提供正确的输出,这意味着如果用户传递了任何有效目录,它将为我提供该目录的磁盘使用情况,如果他/她传递了一些无效目录,脚本将向我返回正确的错误消息

当多个用户同时开始为同一服务器使用脚本并通过两个不同的目录时,问题就会出现

e、 g

用户A:-

$ssh -oConnectTimeout=5 -oBatchMode=yes -l group servername 'bash -s -- /user_A/directory' < ./df_command.sh
用户B:-

$ssh -oConnectTimeout=5 -oBatchMode=yes -l group servername 'bash -s -- /user_B/directory' < ./df_command.sh
现在,由于脚本的tmp文件是相同的/tmp/Global_df_tmp,因此首先启动脚本的人将获得正确的输出,而第二个用户将获得与第一个用户相同的输出

我知道一个解决方案是生成随机数并使用它来代替硬编码的tmp文件,但是如果100个用户使用相同的脚本,那么我将在远程服务器上拥有大量的临时文件

还有其他想法吗


谢谢大家!

显而易见的解决方案是不为临时文件使用固定名称。一种常见的方法是在后缀中使用进程标识符,如/tmp/Global_df_tmp.$$

另外,如果您使用bash,您可以使用$RANDOM获得一个随机数


或者只需使用该命令创建具有随机名称的临时文件。

您可以使用标准mktemp命令生成临时文件名:

# Create a tempfile (in a BSD- and Linux-friendly way) 
my_mktemp () { 
mktemp || mktemp -t my_prefix 
} 2> /dev/null 

declare -r tempfile=$(my_mktemp) || echo "Cannot create temp file" >&2

df -k > "$tempfile" 2>&1
简单解释一下:my_mktemp是一个bash函数,您不需要使用它,如果您在Linux上,只需使用mktemp即可

declare-r tempfile=$cmd运行命令cmd并将其设置为名为temp file的新只读变量的值


之后,您可以使用$tempfile来引用临时文件名。

如果每次有人访问我的服务器时都使用随机文件名,我的服务器上不是会有大量临时文件吗?@embrated\u Entity然后在处理完这些文件后将其删除?