小编ea7*_*abe的帖子

为什么“trap EXIT”在 Bash 的后台作业中不起作用?

我正在尝试创建一个脚本,在后台启动一堆作业,然后等待所有作业运行完成。

#!/bin/sh

cleanup() {
    wait
    echo cleanup
}

do_work() {
    sleep 2
    echo done "$@"
}

run() {
    trap cleanup EXIT
    do_work 1 &
    # ... some code that may fail ...
    do_work 2 &
    # I can't just call cleanup() here because of possible early exit
}

# The script itself runs in the background too.
run&
Run Code Online (Sandbox Code Playgroud)

为了确保该脚本将等待其所有子进程,即使在生成子进程时出现问题,我也会使用而trap cleanup EXIT不是仅cleanup在最后使用。

但是当我在不同的 shell 中运行此脚本时,我得到以下结果:

$ for sh in zsh dash 'busybox ash' bash; do echo "$sh:"; …
Run Code Online (Sandbox Code Playgroud)

bash shell

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

Golang,进程和共享内存

今天,我的一个朋友告诉我,Go程序可以在多个CPU内核上进行扩展。听到系统任务调度程序对goroutine一无所知,因此无法在多个内核上运行它们,我感到非常惊讶。

我进行了一些搜索,发现Go程序可以产生多个OS任务以在不同的内核上运行它们(该数目由GOMAXPROCS环境变量控制)。但是据我所知,对流程进行分叉可导致流程数据的完整复制,并且不同的流程在不同的地址空间中运行。

那么Go程序中的全局变量呢?它们可以安全地与多个goroutine一起使用吗?它们是否以某种方式在系统进程之间同步?如果他们这样做,那又如何?我主要关注linux和freebsd的实现。

linux ipc process shared-memory go

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

标签 统计

bash ×1

go ×1

ipc ×1

linux ×1

process ×1

shared-memory ×1

shell ×1