标签: concurrency

如何在脚本中的 tmux 或 gnome-terminal 中启动一组程序?

我想在 tmux 或 gnome-terminal 或 xfterminal 中同时启动几个命令,每个不同的选项卡都运行一个命令,并在该命令完成时关闭该选项卡。

也欢迎任何其他软件

我想发布一个脚本来完成这项工作,例如 XX "cmd1" "cmd2" "cmd3"

command-line terminal concurrency

39
推荐指数
4
解决办法
5万
查看次数

无法创建常规文件“文件名”:文件存在

我在我的一个构建脚本中收到了这个奇怪的错误消息 -cp失败,返回错误“文件存在”。我什至尝试使用cp -f,如果文件存在,它应该覆盖文件,但错误仍然出现。cp当我手动执行时,运行以覆盖现有文件效果很好。什么可能导致此错误?

cp concurrency

26
推荐指数
1
解决办法
3万
查看次数

在源更新时使用 rsync 是否安全?

rsync假设源文件系统在 rsync 运行时很可能被修改,当源文件系统被挂载和可写时使用它是否安全?我认为在竞争条件下我可能不会得到最新的修改,但是否有任何损坏的风险?

backup rsync concurrency

22
推荐指数
1
解决办法
2万
查看次数

tee + cat:多次使用输出,然后连接结果

如果我调用某个命令,例如,echo我可以在其他几个命令中使用该命令的结果tee。例子:

echo "Hello world!" | tee >(command1) >(command2) >(command3)
Run Code Online (Sandbox Code Playgroud)

使用 cat 我可以收集几个命令的结果。例子:

cat <(command1) <(command2) <(command3)
Run Code Online (Sandbox Code Playgroud)

我希望能够同时做这两件事,这样我就可以tee在其他东西的输出上调用这些命令(例如echo我写的),然后在一个输出上收集所有结果cat.

保持结果为了这一点很重要,这意味着输出的线路command1command2并且command3不应该纠缠在一起,但订购的命令是(因为它与发生cat)。

可能有比cat和更好的选择,tee但这些是我目前所知道的。

我想避免使用临时文件,因为输入和输出的大小可能很大。

我怎么能这样做?

PD:另一个问题是这种情况发生在循环中,这使得处理临时文件变得更加困难。这是我拥有的当前代码,它适用于小型测试用例,但是在以某种我不理解的方式从 auxfile 读取和写入时,它会创建无限循环。

somefunction()
{
  if [ $1 -eq 1 ]
  then
    echo "Hello world!"
  else
    somefunction $(( $1 - 1 )) > auxfile
    cat <(command1 < auxfile) \
        <(command2 < auxfile) \
        <(command3 < auxfile)
  fi …
Run Code Online (Sandbox Code Playgroud)

pipe concurrency cat tee

19
推荐指数
1
解决办法
8850
查看次数

你如何在 Linux (C/C++) 中进行跨进程锁定?

我需要确保一个进程一次只在一个实例中执行。在 Windows 上,您可以使用命名互斥锁。但我不知道在 Linux 上使用什么。

我想我已经看到一种方法是应用程序创建一个独占文件,但我再也找不到它了。您是否使用常规文件功能,忙循环?

process lock concurrency

13
推荐指数
1
解决办法
3万
查看次数

多个进程之间的通信

我有一个 bash 脚本,它运行 manager() 函数作为 x 次的单独进程。如何从脚本中将消息转发到所有 manager() 进程?

我读过匿名管道,但我不知道如何与它共享消息..我尝试使用命名管道来做,但似乎我必须为每个进程创建一个单独的命名管道?

什么是最优雅的方式来做到这一点?

到目前为止,这是我的代码:

#!/bin/bash

manager () {
    while :
    do
        echo "read what has been passed to \$line"
    done
}

x=1
while [ $x -le 5 ]
do
  manager x &
  x=$(( $x + 1 ))
done


while :
do
while read line
do
  echo "What has been passed through the pipe is ${line}"
  # should pass $line to every manager process

done < $1
done

exit 0
Run Code Online (Sandbox Code Playgroud)

bash pipe shell-script concurrency

13
推荐指数
1
解决办法
7423
查看次数

如何以原子方式分配循环设备?

我正在编写一些 shell 脚本来处理一些磁盘映像,我需要使用循环设备来访问一些磁盘映像。但是,我不确定如何在不将我的程序暴露于竞争条件的情况下正确分配循环设备。

我知道我可以losetup -f用来获取下一个未分配的循环设备,然后像这样分配该循环设备:

ld=$(losetup -f)
sudo losetup $ld myfile.img
dostuffwith $ld
Run Code Online (Sandbox Code Playgroud)

但是,在我想同时运行多个程序实例的情况下,这几乎是竞争条件的教科书示例,这让我非常困扰。如果我有这个程序的多个实例正在运行,或者其他程序也试图获得一个循环设备,那么每个进程可能无法在下一个调用之前分配循环设备losetup -f,在这种情况下,两个进程都会认为同一个循环设备可用,但只有一个人可以得到它。

我可以为此使用外部同步,但我想(如果可能)避免额外的复杂性。此外,使用循环设备的其他程序可能不会尊重我可能提出的任何同步。

我怎样才能避免这种潜在的竞争条件?理想情况下,我希望能够以原子方式发现和绑定循环设备,例如使用如下命令:

ld=$(sudo losetup -f myfile.img)
dostuffwith $ld
Run Code Online (Sandbox Code Playgroud)

但是,当我这样做时,$ld不会被分配到循环设备路径,并sudo移出,因为在sudo ld=$(losetup -f myfile.img)给出权限错误。

shell-script concurrency loop-device

11
推荐指数
2
解决办法
4675
查看次数

将文件移动到正在读取的文件

当一个文件被移动并且目标文件已经存在并且正在被读取时,操作会成功吗?是否取决于对目标文件的读取操作持续多长时间?

io concurrency

10
推荐指数
1
解决办法
269
查看次数

为什么包管理器需要锁定文件?

dpkg/var/lib/dpkg/lock在使用时使用锁定文件 ( )。

  • 为什么需要这些锁文件?
  • 为什么不可能有多个实例?

dpkg lock concurrency

10
推荐指数
2
解决办法
1232
查看次数

从多个进程并发写入日志文件

在模仿 MacOS 的终端open命令或 Window 的终端命令时start此答案的注释建议将 stdout 和 stderr 附加到~/.xsession-errors,例如 ( bash):

alias open='&>>~/.xsession-errors xdg-open'
Run Code Online (Sandbox Code Playgroud)

我预见到的问题是竞争条件。lsof ~/.xsession-errors显示 22 个进程打开文件进行写入。

如何防止两个进程写入相同的偏移量~/.xsession-errors

logs x11 concurrency files

9
推荐指数
2
解决办法
1万
查看次数

标签 统计

concurrency ×10

lock ×2

pipe ×2

shell-script ×2

backup ×1

bash ×1

cat ×1

command-line ×1

cp ×1

dpkg ×1

files ×1

io ×1

logs ×1

loop-device ×1

process ×1

rsync ×1

tee ×1

terminal ×1

x11 ×1