#1 Le 17/11/2013, à 14:10
- k3c
[Résolu]Python/ Comment trouver la ligne de commande d'un sous-process
Bonjour
J'ai posté dans trucs astuces et scripts utiles un script qui "enrobe" des commandes get_iplayer pour télécharger des replays de la BBC.
Je voudrais améliorer ce script, et garder la ligne de commande qui fait le boulot, une grosse commande rtmpdump, par exemple dans ce cas
rtmpdump --port 1935 --protocol 0 --playpath mp4:iplayerstream/secure_auth/800kbps/modav/bUnknown-b03hdm2k_b03hdm2k_1384031252426.mp4 --host bbcmedia.fcod.llnwd.net --swfVfy http://www.bbc.co.uk/emp/revisions/18269_21576_10player.swf?revision=18269_21576 --tcUrl rtmp://bbcmedia.fcod.llnwd.net:1935/a1414/e3?as=adobe-hmac-sha256&av=1&te=connect&mp=iplayerstream/secure_auth/800kbps/modav/bUnknown-b03hdm2k_b03hdm2k_1384031252426.mp4&et=1384642956&fmta-token=99b6b26e3d50ca8026a1cd46d0d484879ed34974cbc06647c41e716004575787 --app a1414/e3?as=adobe-hmac-sha256&av=1&te=connect&mp=iplayerstream/secure_auth/800kbps/modav/bUnknown-b03hdm2k_b03hdm2k_1384031252426.mp4&et=1384642956&fmta-token=99b6b26e3d50ca8026a1cd46d0d484879ed34974cbc06647c41e716004575787 --pageUrl http://www.bbc.co.uk/iplayer/episode/b03hdm57/Inspector_Montalbano_Series_3_A_Ray_of_Light/ --swfVfy http://www.bbc.co.uk/emp/releases/iplayer/revisions/617463_618125_4/617463_618125_4_emp.swf --resume -o /home/gg/bbc1/Inspector_Montalbano_Series_3_-_4._A_Ray_of_Light_b03hdm57_default.partial.mp4.flv --timeout 10
par exemple pendant un téléchargement, j'ai 2 process, get_iplayer et rtmpdump
gg 3615 3538 0 22:02 pts/3 00:00:00 /usr/bin/perl /usr/bin/get_iplayer --get 370 --nopurge --subtitles -p http://88.150.181.202:3128
gg 3623 3615 0 22:02 pts/3 00:00:00 rtmpdump --port 1935 --protocol 0 --playpath mp4:iplayerstream/secure_auth/800kbps/modav/bUnknown-b03hdm2k_b03hdm2k_1384
root 3627 2 0 22:04 ? 00:00:00 [kworker/0:1]
gg 3628 3316 0 22:04 pts/4 00:00:00 ps -ef
Comme pour beaucoup de replays, la vidéo reste disponible longtemps si on a la bonne commande, et vu qu'ici on s'embête à tester différents proxys avant d'en trouver un qui marche, ça vaut vraiment le coup de garder cette commande, par exemple si un problème réseau interrompt le téléchargement.
On voit donc que le process qui fait le boulot, le rtmpdump, est un fils du process get_iplayer.
Donc je voudrais récupérer la ligne de commande de ce process, sachant que je veux vraiment le process fils du get_iplayer, vu que je peux avoir n process qui font du rtmpdump (qarte, captvty, script divers de la RTS...)
Si quelqu'un a un script qui fait cela, je suis intéressé.
Merci
Dernière modification par k3c (Le 20/11/2013, à 05:56)
Debian 12 sur Thinkpad reconditionné
Hors ligne
#2 Le 17/11/2013, à 14:55
- darunia_goron
Re : [Résolu]Python/ Comment trouver la ligne de commande d'un sous-process
Essaie :
ps --no-header --ppid LE_PID_DE_GET_IPLAYER
Tu peux aussi jouer avec l'option -o de la commande ps pour formater la sortie.
Par exemple :
ps --no-header --ppid LE_PID_DE_GET_IPLAYER -o pid,args
pour afficher uniquement les PIDs et commandes (avec arguments) des fils.
Dernière modification par darunia_goron (Le 17/11/2013, à 15:05)
Hors ligne
#3 Le 17/11/2013, à 15:15
- k3c
Re : [Résolu]Python/ Comment trouver la ligne de commande d'un sous-process
Merci, je vais essayer, je pensais à du code Python, mais je peux lancer cette commande-là dans un script Python.
:-)
Debian 12 sur Thinkpad reconditionné
Hors ligne
#4 Le 17/11/2013, à 15:23
- darunia_goron
Re : [Résolu]Python/ Comment trouver la ligne de commande d'un sous-process
Je ne connais pas Python mais vu que j'ai une commande qui fait le travail, je me suis permis de répondre.
Un petit oubli de ma part : utilise ww pour enlever les limites de taille de la sortie :
$ ps ww --no-header --ppid LE_PID_DE_GET_IPLAYER
Si ww est omis, la taille maximale est non spécifiée dans le cas où la sortie est redirigée et tu risques de te retrouver avec un nom de commande tronqué.
Hors ligne
#5 Le 17/11/2013, à 15:31
- k3c
Re : [Résolu]Python/ Comment trouver la ligne de commande d'un sous-process
merci, donc finalement
ps ww --no-header --ppid pid_de_get_iplayer -o args
fait le boulot en bash.
Reste juste à le traduire en Python.
Merci encore
Debian 12 sur Thinkpad reconditionné
Hors ligne
#6 Le 18/11/2013, à 07:20
- grim7reaper
Re : [Résolu]Python/ Comment trouver la ligne de commande d'un sous-process
Salut,
Pour cela, tu peux utiliser les info’ disponibles dans le procfs (ps se base dessus, sur Linux du moins).
L’info que tu cherches est dans le fichier /proc/[pid]/cmdline.
This holds the complete command line for the process, unless the process is a zombie. In the latter case, there is nothing in this file: that is, a read on this file will return 0 characters. The command-line arguments appear in this file as a set of strings separated by null bytes ('\0'), with a further null byte after the last string.
Donc du coup, il te suffire de lire le fichier, virer le null byte terminal et remplacer les autres par des espaces pour obtenir ta ligne de commande :
>>> with open('/proc/1076/cmdline') as src:
>>> cmdline = src.readline()[:-1].replace('\x00', ' ')
>>> cmdline
/usr/bin/dbus-daemon --fork --print-pid 6 --print-address 8 --config-file /usr/share/fcitx/dbus/daemon.conf
Hors ligne
#7 Le 18/11/2013, à 09:23
- k3c
Re : [Résolu]Python/ Comment trouver la ligne de commande d'un sous-process
@ grim7reaper
Excellent !
Il me reste à trouver le pid du petit fils, vu que mon script Python lance une commande get_iplayer qui lance le rtmpdump
Et donner au fichier le nom de l'épisode, du genre
Ambassadors_s1_e03.sh
Je teste ce soir
Debian 12 sur Thinkpad reconditionné
Hors ligne
#8 Le 18/11/2013, à 21:03
- k3c
Re : [Résolu]Python/ Comment trouver la ligne de commande d'un sous-process
Bon, si
process = subprocess.Popen(arguments, stdout=subprocess.PIPE, stderr=sub
process.PIPE)
pid = process.pid
récupère bien le pid voulu, comme la commande suivante (le get_iplayer) est du Perl, pas de moi, je crois que je vais lancer un bête bash qui fera le boulot.
Merci à tous
Edit : il faut surtout que je re-écrive en Python juste les 2 parties de get_iplayer qui m'intéressent
1) la recherche
get_iplayer cagney
va trouver la série Cagney et Lacey
et montrer qu'il a un identifiant 691 par exemple
2) le téléchargement
get_iplayer --get 691
va télécharger cette vidéo
Si un bon connaisseur de Perl veut m'aider sur ce coup, il est le bienvenu
Dernière modification par k3c (Le 18/11/2013, à 21:50)
Debian 12 sur Thinkpad reconditionné
Hors ligne
#9 Le 20/11/2013, à 05:16
- grim7reaper
Re : [Résolu]Python/ Comment trouver la ligne de commande d'un sous-process
Si un bon connaisseur de Perl veut m'aider sur ce coup, il est le bienvenu
Je pense que tu auras plus de chance d’avoir des réponses en ouvrant un autre sujet avec un titre adapté (et tu pourras passer celui-ci en résolu)
Hors ligne
#10 Le 20/11/2013, à 05:55
- k3c
Re : [Résolu]Python/ Comment trouver la ligne de commande d'un sous-process
Tu as raison, mais ce n'est plus la peine, j'ai trouvé une version en Python de get_iplayer
xbmc-iplayer-plugin
Je vais repartir de ce code-là.
Debian 12 sur Thinkpad reconditionné
Hors ligne