2013-07-13 130 views
4

我已經構建了一個bash腳本來啓動我的系統中的一些進程。它只是調用進程和相關的配置文件。和我從命令行調用的一樣。從shell調用腳本和使用system()之間有什麼區別?

#!/bin/bash 
# Start specified process in a new session 
setsid $1 &>/dev/null & 

所以啓動someprocess,我會在命令行稱:

[email protected]:~# start someprocess 

這就像一個魅力。每一個過程,每一次。但是當我從一個不同的正在運行的C++進程調用system時,someprocess永遠不會啓動。

system("start someprocess") 

這種方法對我的90%的過程,除了一個。在工作和非工作過程中唯一的區別在於非工作過程使用下面的專有庫。我最近將setsid選項添加到了bash腳本中,希望開始一個新的會話會有所幫助,但它沒有任何區別。我也試過popenexecv。不用找了。

所以我的問題是調用某些東西與system(),只是從命令行進行相同的調用有什麼區別?

所有過程都用C++編寫Linux上。

+1

有什麼不同:也許是環境? –

+1

你有沒有檢查通常的嫌疑犯 - 權限,LD_PATH,環境變量等? C++系統包裝是相同的用戶和/或根等等?你從系統,popen,execv等得到什麼樣的errno值? – Duck

+0

@Kerrek SB,@Duck在'〜/中設置了環境變量。bashrc'這個程序,當我用'system()'開始我的程序時,如何確保/檢查它們是否被設置?我認爲調用bash腳本意味着'bashrc'源自 –

回答

2

.bashrc僅在bash作爲交互式非登錄shell運行時纔會被調用。如果它被援引作爲非交互的shell,與一個bash認領腳本中使用system()時一樣,只讀取配置文件,通過$BASH_ENV指向。

這意味着你有以下幾種選擇:

  • 添加-l的家當 - 導致shell啓動
  • 設置$BASH_ENV您要採購的腳本中調用system()
  • 加之前閱讀~/.profile-i的家當 - 調用bash作爲交互shell並使其閱讀~/.bashrc,但也會影響bash中如何處理輸入/輸出。

我推薦第一個選項。

你可以找到關於bash如何讀取啓動文件here的詳細說明。我不確定這會完全解決你的問題,但它可能會在這個問題上澄清一些問題。

+0

前兩種解決方案似乎並不奏效,但我可以在我的shell腳本中包含源命令來設置所有相關的環境變量。你把我放在正確的道路上。謝謝! –

2

檢查system()調用中使用的環境變量。例如,調用system來打印出一些變量,看它們是否與你從命令行看到的一致。

可能他們沒有被正確地採購。

相關問題